summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2020-03-06 05:11:18 -0300
committerGravatar ReinUsesLisp2020-03-13 18:33:05 -0300
commit2fae1e6205c16903625c993c8d46a6c0905a6d41 (patch)
treeec99566a2ee431e6dc0ca7a4b5e28aa8beee2cde /src/video_core
parentvk_shader_decompiler: Add XFB decorations to generic varyings (diff)
downloadyuzu-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.cpp42
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.h4
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
361void RasterizerVulkan::Clear() { 365void RasterizerVulkan::Clear() {
@@ -738,6 +742,44 @@ void RasterizerVulkan::UpdateDynamicStates() {
738 UpdateStencilFaces(regs); 742 UpdateStencilFaces(regs);
739} 743}
740 744
745void 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
773void 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
741void RasterizerVulkan::SetupVertexArrays(FixedPipelineState::VertexInput& vertex_input, 783void 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,