summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.cpp4
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp48
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.h2
3 files changed, 34 insertions, 20 deletions
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
index 6b54d7111..487d8b416 100644
--- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
@@ -56,7 +56,8 @@ vk::Buffer CreateBuffer(const Device& device, u64 size) {
56 VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | 56 VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
57 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | 57 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT |
58 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | 58 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
59 VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; 59 VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT |
60 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
60 if (device.IsExtTransformFeedbackSupported()) { 61 if (device.IsExtTransformFeedbackSupported()) {
61 flags |= VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT; 62 flags |= VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
62 } 63 }
@@ -516,6 +517,7 @@ void BufferCacheRuntime::ReserveNullBuffer() {
516 if (device.IsExtTransformFeedbackSupported()) { 517 if (device.IsExtTransformFeedbackSupported()) {
517 create_info.usage |= VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT; 518 create_info.usage |= VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
518 } 519 }
520 create_info.usage |= VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
519 null_buffer = device.GetLogical().CreateBuffer(create_info); 521 null_buffer = device.GetLogical().CreateBuffer(create_info);
520 if (device.HasDebuggingToolAttached()) { 522 if (device.HasDebuggingToolAttached()) {
521 null_buffer.SetObjectNameEXT("Null buffer"); 523 null_buffer.SetObjectNameEXT("Null buffer");
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
index 9b75f33dd..6f1adc97f 100644
--- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp
+++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
@@ -225,25 +225,40 @@ void RasterizerVulkan::Draw(bool is_indexed, u32 instance_count) {
225 }); 225 });
226} 226}
227 227
228void RasterizerVulkan::DrawIndirect(bool is_indexed) { 228void RasterizerVulkan::DrawIndirect() {
229 PrepareDraw(is_indexed, [this, is_indexed] { 229 const auto& params = maxwell3d->draw_manager->GetIndirectParams();
230 const auto params = maxwell3d->draw_manager->GetIndirectParams(); 230 buffer_cache.SetDrawIndirect(&params);
231 const auto [buffer, offset] = buffer_cache.ObtainBuffer( 231 PrepareDraw(params.is_indexed, [this, &params] {
232 params.start_address, static_cast<u32>(params.buffer_size), true, false); 232 const auto [buffer, offset] = buffer_cache.GetDrawIndirectBuffer();
233 scheduler.Record([buffer_obj = buffer->Handle(), offset, 233 if (params.include_count) {
234 max_draw_counts = params.max_draw_counts, stride = params.stride, 234 const auto [draw_buffer, offset_base] = buffer_cache.GetDrawIndirectCount();
235 is_indexed](vk::CommandBuffer cmdbuf) { 235 scheduler.Record([draw_buffer_obj = draw_buffer->Handle(),
236 if (is_indexed) { 236 buffer_obj = buffer->Handle(), offset_base, offset,
237 cmdbuf.DrawIndexedIndirectCount(buffer_obj, offset + 4ULL, buffer_obj, offset, 237 params](vk::CommandBuffer cmdbuf) {
238 static_cast<u32>(max_draw_counts), 238 if (params.is_indexed) {
239 static_cast<u32>(stride)); 239 cmdbuf.DrawIndexedIndirectCount(
240 buffer_obj, offset, draw_buffer_obj, offset_base,
241 static_cast<u32>(params.max_draw_counts), static_cast<u32>(params.stride));
242 } else {
243 cmdbuf.DrawIndirectCount(buffer_obj, offset, draw_buffer_obj, offset_base,
244 static_cast<u32>(params.max_draw_counts),
245 static_cast<u32>(params.stride));
246 }
247 });
248 return;
249 }
250 scheduler.Record([buffer_obj = buffer->Handle(), offset, params](vk::CommandBuffer cmdbuf) {
251 if (params.is_indexed) {
252 cmdbuf.DrawIndexedIndirect(buffer_obj, offset,
253 static_cast<u32>(params.max_draw_counts),
254 static_cast<u32>(params.stride));
240 } else { 255 } else {
241 cmdbuf.DrawIndirectCount(buffer_obj, offset + 4ULL, buffer_obj, offset, 256 cmdbuf.DrawIndirect(buffer_obj, offset, static_cast<u32>(params.max_draw_counts),
242 static_cast<u32>(max_draw_counts), 257 static_cast<u32>(params.stride));
243 static_cast<u32>(stride));
244 } 258 }
245 }); 259 });
246 }); 260 });
261 buffer_cache.SetDrawIndirect(nullptr);
247} 262}
248 263
249void RasterizerVulkan::Clear(u32 layer_count) { 264void RasterizerVulkan::Clear(u32 layer_count) {
@@ -425,9 +440,6 @@ void RasterizerVulkan::FlushRegion(VAddr addr, u64 size) {
425 440
426bool RasterizerVulkan::MustFlushRegion(VAddr addr, u64 size) { 441bool RasterizerVulkan::MustFlushRegion(VAddr addr, u64 size) {
427 std::scoped_lock lock{texture_cache.mutex, buffer_cache.mutex}; 442 std::scoped_lock lock{texture_cache.mutex, buffer_cache.mutex};
428 if (!Settings::IsGPULevelHigh()) {
429 return buffer_cache.IsRegionGpuModified(addr, size);
430 }
431 return texture_cache.IsRegionGpuModified(addr, size) || 443 return texture_cache.IsRegionGpuModified(addr, size) ||
432 buffer_cache.IsRegionGpuModified(addr, size); 444 buffer_cache.IsRegionGpuModified(addr, size);
433} 445}
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h
index bc43a8a1f..43a210da0 100644
--- a/src/video_core/renderer_vulkan/vk_rasterizer.h
+++ b/src/video_core/renderer_vulkan/vk_rasterizer.h
@@ -65,7 +65,7 @@ public:
65 ~RasterizerVulkan() override; 65 ~RasterizerVulkan() override;
66 66
67 void Draw(bool is_indexed, u32 instance_count) override; 67 void Draw(bool is_indexed, u32 instance_count) override;
68 void DrawIndirect(bool is_indexed) override; 68 void DrawIndirect() override;
69 void Clear(u32 layer_count) override; 69 void Clear(u32 layer_count) override;
70 void DispatchCompute() override; 70 void DispatchCompute() override;
71 void ResetCounter(VideoCore::QueryType type) override; 71 void ResetCounter(VideoCore::QueryType type) override;