Browse Source
Merge pull request #2786 from ReinUsesLisp/vote
Merge pull request #2786 from ReinUsesLisp/vote
shader_ir: Implement VOTE on Nvidia driverspull/15/merge
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 164 additions and 1 deletions
-
1CMakeModules/GenerateSCMRev.cmake
-
1src/common/CMakeLists.txt
-
1src/video_core/CMakeLists.txt
-
16src/video_core/engines/shader_bytecode.h
-
3src/video_core/renderer_opengl/gl_device.cpp
-
5src/video_core/renderer_opengl/gl_device.h
-
4src/video_core/renderer_opengl/gl_shader_cache.cpp
-
47src/video_core/renderer_opengl/gl_shader_decompiler.cpp
-
25src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
-
1src/video_core/shader/decode.cpp
-
55src/video_core/shader/decode/warp.cpp
-
5src/video_core/shader/node.h
-
1src/video_core/shader/shader_ir.h
@ -0,0 +1,55 @@ |
|||
// Copyright 2019 yuzu Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "common/assert.h"
|
|||
#include "common/common_types.h"
|
|||
#include "video_core/engines/shader_bytecode.h"
|
|||
#include "video_core/shader/node_helper.h"
|
|||
#include "video_core/shader/shader_ir.h"
|
|||
|
|||
namespace VideoCommon::Shader { |
|||
|
|||
using Tegra::Shader::Instruction; |
|||
using Tegra::Shader::OpCode; |
|||
using Tegra::Shader::Pred; |
|||
using Tegra::Shader::VoteOperation; |
|||
|
|||
namespace { |
|||
OperationCode GetOperationCode(VoteOperation vote_op) { |
|||
switch (vote_op) { |
|||
case VoteOperation::All: |
|||
return OperationCode::VoteAll; |
|||
case VoteOperation::Any: |
|||
return OperationCode::VoteAny; |
|||
case VoteOperation::Eq: |
|||
return OperationCode::VoteEqual; |
|||
default: |
|||
UNREACHABLE_MSG("Invalid vote operation={}", static_cast<u64>(vote_op)); |
|||
return OperationCode::VoteAll; |
|||
} |
|||
} |
|||
} // Anonymous namespace
|
|||
|
|||
u32 ShaderIR::DecodeWarp(NodeBlock& bb, u32 pc) { |
|||
const Instruction instr = {program_code[pc]}; |
|||
const auto opcode = OpCode::Decode(instr); |
|||
|
|||
switch (opcode->get().GetId()) { |
|||
case OpCode::Id::VOTE: { |
|||
const Node value = GetPredicate(instr.vote.value, instr.vote.negate_value != 0); |
|||
const Node active = Operation(OperationCode::BallotThread, value); |
|||
const Node vote = Operation(GetOperationCode(instr.vote.operation), value); |
|||
SetRegister(bb, instr.gpr0, active); |
|||
SetPredicate(bb, instr.vote.dest_pred, vote); |
|||
break; |
|||
} |
|||
default: |
|||
UNIMPLEMENTED_MSG("Unhandled warp instruction: {}", opcode->get().GetName()); |
|||
break; |
|||
} |
|||
|
|||
return pc; |
|||
} |
|||
|
|||
} // namespace VideoCommon::Shader
|
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue