From c36982d45c2eb531bccdcf9bf7dd7357c32bf8b9 Mon Sep 17 00:00:00 2001
From: Ethan Lee <[EMAIL REDACTED]>
Date: Thu, 12 Sep 2024 13:32:15 -0400
Subject: [PATCH] vulkan: Avoid redundant commands for dynamic states
---
src/gpu/vulkan/SDL_gpu_vulkan.c | 74 +++++++++++++--------------------
1 file changed, 28 insertions(+), 46 deletions(-)
diff --git a/src/gpu/vulkan/SDL_gpu_vulkan.c b/src/gpu/vulkan/SDL_gpu_vulkan.c
index 05d5a3c916970..b87c0d48d3cd3 100644
--- a/src/gpu/vulkan/SDL_gpu_vulkan.c
+++ b/src/gpu/vulkan/SDL_gpu_vulkan.c
@@ -7440,6 +7440,7 @@ static void VULKAN_INTERNAL_SetCurrentViewport(
const SDL_GPUViewport *viewport)
{
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer *)commandBuffer;
+ VulkanRenderer *renderer = (VulkanRenderer *)vulkanCommandBuffer->renderer;
vulkanCommandBuffer->currentViewport.x = viewport->x;
vulkanCommandBuffer->currentViewport.width = viewport->w;
@@ -7450,6 +7451,12 @@ static void VULKAN_INTERNAL_SetCurrentViewport(
// FIXME: need moltenVK hack
vulkanCommandBuffer->currentViewport.y = viewport->y + viewport->h;
vulkanCommandBuffer->currentViewport.height = -viewport->h;
+
+ renderer->vkCmdSetViewport(
+ vulkanCommandBuffer->commandBuffer,
+ 0,
+ 1,
+ &vulkanCommandBuffer->currentViewport);
}
static void VULKAN_SetViewport(
@@ -7457,27 +7464,28 @@ static void VULKAN_SetViewport(
const SDL_GPUViewport *viewport)
{
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer *)commandBuffer;
- VulkanRenderer *renderer = (VulkanRenderer *)vulkanCommandBuffer->renderer;
VULKAN_INTERNAL_SetCurrentViewport(
vulkanCommandBuffer,
viewport);
-
- renderer->vkCmdSetViewport(
- vulkanCommandBuffer->commandBuffer,
- 0,
- 1,
- &vulkanCommandBuffer->currentViewport);
}
static void VULKAN_INTERNAL_SetCurrentScissor(
VulkanCommandBuffer *vulkanCommandBuffer,
const SDL_Rect *scissor)
{
+ VulkanRenderer *renderer = (VulkanRenderer *)vulkanCommandBuffer->renderer;
+
vulkanCommandBuffer->currentScissor.offset.x = scissor->x;
vulkanCommandBuffer->currentScissor.offset.y = scissor->y;
vulkanCommandBuffer->currentScissor.extent.width = scissor->w;
vulkanCommandBuffer->currentScissor.extent.height = scissor->h;
+
+ renderer->vkCmdSetScissor(
+ vulkanCommandBuffer->commandBuffer,
+ 0,
+ 1,
+ &vulkanCommandBuffer->currentScissor);
}
static void VULKAN_SetScissor(
@@ -7485,27 +7493,26 @@ static void VULKAN_SetScissor(
const SDL_Rect *scissor)
{
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer *)commandBuffer;
- VulkanRenderer *renderer = (VulkanRenderer *)vulkanCommandBuffer->renderer;
VULKAN_INTERNAL_SetCurrentScissor(
vulkanCommandBuffer,
scissor);
-
- renderer->vkCmdSetScissor(
- vulkanCommandBuffer->commandBuffer,
- 0,
- 1,
- &vulkanCommandBuffer->currentScissor);
}
static void VULKAN_INTERNAL_SetCurrentBlendConstants(
VulkanCommandBuffer *vulkanCommandBuffer,
SDL_FColor blendConstants)
{
+ VulkanRenderer *renderer = (VulkanRenderer *)vulkanCommandBuffer->renderer;
+
vulkanCommandBuffer->blendConstants[0] = blendConstants.r;
vulkanCommandBuffer->blendConstants[1] = blendConstants.g;
vulkanCommandBuffer->blendConstants[2] = blendConstants.b;
vulkanCommandBuffer->blendConstants[3] = blendConstants.a;
+
+ renderer->vkCmdSetBlendConstants(
+ vulkanCommandBuffer->commandBuffer,
+ vulkanCommandBuffer->blendConstants);
}
static void VULKAN_SetBlendConstants(
@@ -7513,22 +7520,24 @@ static void VULKAN_SetBlendConstants(
SDL_FColor blendConstants)
{
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer *)commandBuffer;
- VulkanRenderer *renderer = (VulkanRenderer *)vulkanCommandBuffer->renderer;
VULKAN_INTERNAL_SetCurrentBlendConstants(
vulkanCommandBuffer,
blendConstants);
-
- renderer->vkCmdSetBlendConstants(
- vulkanCommandBuffer->commandBuffer,
- vulkanCommandBuffer->blendConstants);
}
static void VULKAN_INTERNAL_SetCurrentStencilReference(
VulkanCommandBuffer *vulkanCommandBuffer,
Uint8 reference)
{
+ VulkanRenderer *renderer = (VulkanRenderer *)vulkanCommandBuffer->renderer;
+
vulkanCommandBuffer->stencilRef = reference;
+
+ renderer->vkCmdSetStencilReference(
+ vulkanCommandBuffer->commandBuffer,
+ VK_STENCIL_FACE_FRONT_AND_BACK,
+ vulkanCommandBuffer->stencilRef);
}
static void VULKAN_SetStencilReference(
@@ -7536,16 +7545,10 @@ static void VULKAN_SetStencilReference(
Uint8 reference)
{
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer *)commandBuffer;
- VulkanRenderer *renderer = (VulkanRenderer *)vulkanCommandBuffer->renderer;
VULKAN_INTERNAL_SetCurrentStencilReference(
vulkanCommandBuffer,
reference);
-
- renderer->vkCmdSetStencilReference(
- vulkanCommandBuffer->commandBuffer,
- VK_STENCIL_FACE_FRONT_AND_BACK,
- reference);
}
static void VULKAN_BindVertexSamplers(
@@ -8058,27 +8061,6 @@ static void VULKAN_BindGraphicsPipeline(
VULKAN_INTERNAL_TrackGraphicsPipeline(vulkanCommandBuffer, pipeline);
- renderer->vkCmdSetViewport(
- vulkanCommandBuffer->commandBuffer,
- 0,
- 1,
- &vulkanCommandBuffer->currentViewport);
-
- renderer->vkCmdSetScissor(
- vulkanCommandBuffer->commandBuffer,
- 0,
- 1,
- &vulkanCommandBuffer->currentScissor);
-
- renderer->vkCmdSetBlendConstants(
- vulkanCommandBuffer->commandBuffer,
- vulkanCommandBuffer->blendConstants);
-
- renderer->vkCmdSetStencilReference(
- vulkanCommandBuffer->commandBuffer,
- VK_STENCIL_FACE_FRONT_AND_BACK,
- vulkanCommandBuffer->stencilRef);
-
// Acquire uniform buffers if necessary
for (Uint32 i = 0; i < pipeline->resourceLayout.vertexUniformBufferCount; i += 1) {
if (vulkanCommandBuffer->vertexUniformBuffers[i] == NULL) {