mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-07-09 02:39:42 +00:00
Issue a batch when changing render targets in the Vulkan renderer
Otherwise we get rendering artifacts that look like drawing is being applied to the wrong render target
(cherry picked from commit 464b90b475)
This commit is contained in:
@@ -3157,9 +3157,24 @@ static bool VULKAN_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
|
||||
VULKAN_EnsureCommandBuffer(rendererData);
|
||||
|
||||
if (!texture) {
|
||||
if (rendererData->textureRenderTarget) {
|
||||
if (texture) {
|
||||
textureData = (VULKAN_TextureData *)texture->internal;
|
||||
|
||||
if (textureData->mainImage.imageView == VK_NULL_HANDLE) {
|
||||
return SDL_SetError("specified texture is not a render target");
|
||||
}
|
||||
|
||||
rendererData->textureRenderTarget = textureData;
|
||||
VULKAN_RecordPipelineImageBarrier(rendererData,
|
||||
VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
|
||||
VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
|
||||
rendererData->textureRenderTarget->mainImage.image,
|
||||
&rendererData->textureRenderTarget->mainImage.imageLayout);
|
||||
} else {
|
||||
if (rendererData->textureRenderTarget) {
|
||||
VULKAN_RecordPipelineImageBarrier(rendererData,
|
||||
VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
|
||||
VK_ACCESS_SHADER_READ_BIT,
|
||||
@@ -3170,24 +3185,9 @@ static bool VULKAN_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
&rendererData->textureRenderTarget->mainImage.imageLayout);
|
||||
}
|
||||
rendererData->textureRenderTarget = NULL;
|
||||
return true;
|
||||
}
|
||||
|
||||
textureData = (VULKAN_TextureData *)texture->internal;
|
||||
|
||||
if (textureData->mainImage.imageView == VK_NULL_HANDLE) {
|
||||
return SDL_SetError("specified texture is not a render target");
|
||||
}
|
||||
|
||||
rendererData->textureRenderTarget = textureData;
|
||||
VULKAN_RecordPipelineImageBarrier(rendererData,
|
||||
VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
|
||||
VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
|
||||
rendererData->textureRenderTarget->mainImage.image,
|
||||
&rendererData->textureRenderTarget->mainImage.imageLayout);
|
||||
VULKAN_IssueBatch(rendererData);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user