diff options
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 48 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.h | 2 |
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 | ||
| 228 | void RasterizerVulkan::DrawIndirect(bool is_indexed) { | 228 | void 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(¶ms); |
| 231 | const auto [buffer, offset] = buffer_cache.ObtainBuffer( | 231 | PrepareDraw(params.is_indexed, [this, ¶ms] { |
| 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 | ||
| 249 | void RasterizerVulkan::Clear(u32 layer_count) { | 264 | void RasterizerVulkan::Clear(u32 layer_count) { |
| @@ -425,9 +440,6 @@ void RasterizerVulkan::FlushRegion(VAddr addr, u64 size) { | |||
| 425 | 440 | ||
| 426 | bool RasterizerVulkan::MustFlushRegion(VAddr addr, u64 size) { | 441 | bool 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; |