diff options
| author | 2020-03-06 05:11:18 -0300 | |
|---|---|---|
| committer | 2020-03-13 18:33:05 -0300 | |
| commit | 2fae1e6205c16903625c993c8d46a6c0905a6d41 (patch) | |
| tree | ec99566a2ee431e6dc0ca7a4b5e28aa8beee2cde /src/video_core | |
| parent | vk_shader_decompiler: Add XFB decorations to generic varyings (diff) | |
| download | yuzu-2fae1e6205c16903625c993c8d46a6c0905a6d41.tar.gz yuzu-2fae1e6205c16903625c993c8d46a6c0905a6d41.tar.xz yuzu-2fae1e6205c16903625c993c8d46a6c0905a6d41.zip | |
vk_rasterizer: Implement transform feedback binding zero
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 42 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.h | 4 |
2 files changed, 46 insertions, 0 deletions
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 2bcb17b56..f889019c1 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -347,6 +347,8 @@ void RasterizerVulkan::Draw(bool is_indexed, bool is_instanced) { | |||
| 347 | [&pipeline](auto cmdbuf, auto& dld) { cmdbuf.setCheckpointNV(&pipeline, dld); }); | 347 | [&pipeline](auto cmdbuf, auto& dld) { cmdbuf.setCheckpointNV(&pipeline, dld); }); |
| 348 | } | 348 | } |
| 349 | 349 | ||
| 350 | BeginTransformFeedback(); | ||
| 351 | |||
| 350 | const auto pipeline_layout = pipeline.GetLayout(); | 352 | const auto pipeline_layout = pipeline.GetLayout(); |
| 351 | const auto descriptor_set = pipeline.CommitDescriptorSet(); | 353 | const auto descriptor_set = pipeline.CommitDescriptorSet(); |
| 352 | scheduler.Record([pipeline_layout, descriptor_set, draw_params](auto cmdbuf, auto& dld) { | 354 | scheduler.Record([pipeline_layout, descriptor_set, draw_params](auto cmdbuf, auto& dld) { |
| @@ -356,6 +358,8 @@ void RasterizerVulkan::Draw(bool is_indexed, bool is_instanced) { | |||
| 356 | } | 358 | } |
| 357 | draw_params.Draw(cmdbuf, dld); | 359 | draw_params.Draw(cmdbuf, dld); |
| 358 | }); | 360 | }); |
| 361 | |||
| 362 | EndTransformFeedback(); | ||
| 359 | } | 363 | } |
| 360 | 364 | ||
| 361 | void RasterizerVulkan::Clear() { | 365 | void RasterizerVulkan::Clear() { |
| @@ -738,6 +742,44 @@ void RasterizerVulkan::UpdateDynamicStates() { | |||
| 738 | UpdateStencilFaces(regs); | 742 | UpdateStencilFaces(regs); |
| 739 | } | 743 | } |
| 740 | 744 | ||
| 745 | void RasterizerVulkan::BeginTransformFeedback() { | ||
| 746 | const auto& regs = system.GPU().Maxwell3D().regs; | ||
| 747 | if (regs.tfb_enabled == 0) { | ||
| 748 | return; | ||
| 749 | } | ||
| 750 | |||
| 751 | UNIMPLEMENTED_IF(regs.IsShaderConfigEnabled(Maxwell::ShaderProgram::TesselationControl) || | ||
| 752 | regs.IsShaderConfigEnabled(Maxwell::ShaderProgram::TesselationEval) || | ||
| 753 | regs.IsShaderConfigEnabled(Maxwell::ShaderProgram::Geometry)); | ||
| 754 | |||
| 755 | UNIMPLEMENTED_IF(regs.tfb_bindings[1].buffer_enable); | ||
| 756 | UNIMPLEMENTED_IF(regs.tfb_bindings[2].buffer_enable); | ||
| 757 | UNIMPLEMENTED_IF(regs.tfb_bindings[3].buffer_enable); | ||
| 758 | |||
| 759 | const auto& binding = regs.tfb_bindings[0]; | ||
| 760 | UNIMPLEMENTED_IF(binding.buffer_enable == 0); | ||
| 761 | UNIMPLEMENTED_IF(binding.buffer_offset != 0); | ||
| 762 | |||
| 763 | const GPUVAddr gpu_addr = binding.Address(); | ||
| 764 | const std::size_t size = binding.buffer_size; | ||
| 765 | const auto [buffer, offset] = buffer_cache.UploadMemory(gpu_addr, size, 4, true); | ||
| 766 | |||
| 767 | scheduler.Record([buffer = *buffer, offset = offset, size](auto cmdbuf, auto& dld) { | ||
| 768 | cmdbuf.bindTransformFeedbackBuffersEXT(0, {buffer}, {offset}, {size}, dld); | ||
| 769 | cmdbuf.beginTransformFeedbackEXT(0, {}, {}, dld); | ||
| 770 | }); | ||
| 771 | } | ||
| 772 | |||
| 773 | void RasterizerVulkan::EndTransformFeedback() { | ||
| 774 | const auto& regs = system.GPU().Maxwell3D().regs; | ||
| 775 | if (regs.tfb_enabled == 0) { | ||
| 776 | return; | ||
| 777 | } | ||
| 778 | |||
| 779 | scheduler.Record( | ||
| 780 | [](auto cmdbuf, auto& dld) { cmdbuf.endTransformFeedbackEXT(0, {}, {}, dld); }); | ||
| 781 | } | ||
| 782 | |||
| 741 | void RasterizerVulkan::SetupVertexArrays(FixedPipelineState::VertexInput& vertex_input, | 783 | void RasterizerVulkan::SetupVertexArrays(FixedPipelineState::VertexInput& vertex_input, |
| 742 | BufferBindings& buffer_bindings) { | 784 | BufferBindings& buffer_bindings) { |
| 743 | const auto& regs = system.GPU().Maxwell3D().regs; | 785 | const auto& regs = system.GPU().Maxwell3D().regs; |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 96ea05f0a..b2e73d98d 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h | |||
| @@ -169,6 +169,10 @@ private: | |||
| 169 | 169 | ||
| 170 | void UpdateDynamicStates(); | 170 | void UpdateDynamicStates(); |
| 171 | 171 | ||
| 172 | void BeginTransformFeedback(); | ||
| 173 | |||
| 174 | void EndTransformFeedback(); | ||
| 175 | |||
| 172 | bool WalkAttachmentOverlaps(const CachedSurfaceView& attachment); | 176 | bool WalkAttachmentOverlaps(const CachedSurfaceView& attachment); |
| 173 | 177 | ||
| 174 | void SetupVertexArrays(FixedPipelineState::VertexInput& vertex_input, | 178 | void SetupVertexArrays(FixedPipelineState::VertexInput& vertex_input, |