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