From 23aed89ad9b31aea20c94e694710a90504a5dde7 Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Tue, 5 Mar 2024 22:24:33 -0800 Subject: [PATCH] more download fixes --- src/Refresh_Driver_D3D11.c | 36 ++++++++---------------------------- src/Refresh_Driver_Vulkan.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 28 deletions(-) diff --git a/src/Refresh_Driver_D3D11.c b/src/Refresh_Driver_D3D11.c index 39ebe58..ce98c52 100644 --- a/src/Refresh_Driver_D3D11.c +++ b/src/Refresh_Driver_D3D11.c @@ -2086,8 +2086,8 @@ static void D3D11_DownloadFromTexture( d3d11Texture->levelCount ); int32_t formatSize = Texture_GetFormatSize(d3d11Texture->format); - uint32_t bufferStride = copyParams->bufferStride; - uint32_t bufferImageHeight = copyParams->bufferImageHeight; + uint32_t bufferStride = copyParams->bufferStride == 0 ? (textureRegion->w * formatSize) : copyParams->bufferStride; + uint32_t bufferImageHeight = copyParams->bufferImageHeight == 0 ? (textureRegion->h * formatSize) : copyParams->bufferImageHeight; D3D11_BOX srcBox = {textureRegion->x, textureRegion->y, textureRegion->z, textureRegion->x + textureRegion->w, textureRegion->y + textureRegion->h, 1}; D3D11_MAPPED_SUBRESOURCE subresource; HRESULT res; @@ -2130,7 +2130,7 @@ static void D3D11_DownloadFromTexture( renderer->immediateContext, stagingTexture, 0, - copyParams->bufferOffset, + 0, 0, 0, d3d11Texture->handle, @@ -2142,43 +2142,23 @@ static void D3D11_DownloadFromTexture( res = ID3D11DeviceContext_Map( renderer->immediateContext, stagingTexture, - subresourceIndex, + 0, D3D11_MAP_READ, 0, &subresource ); ERROR_CHECK_RETURN("Could not map texture for reading",) - if (bufferStride == 0) - { - bufferStride = BytesPerRow(textureRegion->w, d3d11Texture->format); - } - if (bufferImageHeight == 0) - { - bufferImageHeight = textureRegion->h; - } - uint8_t* dataPtr = (uint8_t*) d3d11TransferBuffer->data + copyParams->bufferOffset; - if (bufferStride == 0 && bufferImageHeight == 0) // assume tightly packed + for (uint32_t row = textureRegion->y; row < textureRegion->h; row += 1) { SDL_memcpy( dataPtr, - (uint8_t *)subresource.pData, - BytesPerImage(textureRegion->w, textureRegion->h, d3d11Texture->format) + (uint8_t*) subresource.pData + (row * subresource.RowPitch) + (textureRegion->x * formatSize), + bufferStride ); - } - else - { - for (uint32_t row = textureRegion->y; row < bufferImageHeight; row += 1) - { - SDL_memcpy( - dataPtr, - (uint8_t*) subresource.pData + (row * bufferStride) + (textureRegion->x * formatSize), - textureRegion->w * formatSize - ); - dataPtr += textureRegion->w * formatSize; - } + dataPtr += bufferStride; } ID3D11DeviceContext1_Unmap( diff --git a/src/Refresh_Driver_Vulkan.c b/src/Refresh_Driver_Vulkan.c index 7c24e25..743a4ee 100644 --- a/src/Refresh_Driver_Vulkan.c +++ b/src/Refresh_Driver_Vulkan.c @@ -10212,6 +10212,8 @@ static void VULKAN_DownloadFromTexture( vulkanTextureSlice = VULKAN_INTERNAL_RefreshToVulkanTextureSlice(&textureRegion->textureSlice); Refresh_Fence *fence; VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) VULKAN_AcquireCommandBuffer(driverData); + VulkanResourceAccessType originalTextureSliceAccessType; + VulkanResourceAccessType originalBufferAccessType; if ( transferOption == REFRESH_TRANSFEROPTIONS_SAFEDISCARD && @@ -10224,6 +10226,9 @@ static void VULKAN_DownloadFromTexture( vulkanTextureSlice = VULKAN_INTERNAL_RefreshToVulkanTextureSlice(&textureRegion->textureSlice); } + originalTextureSliceAccessType = vulkanTextureSlice->resourceAccessType; + originalBufferAccessType = transferBufferContainer->activeBufferHandle->vulkanBuffer->resourceAccessType; + VULKAN_INTERNAL_BufferMemoryBarrier( renderer, vulkanCommandBuffer->commandBuffer, @@ -10261,6 +10266,19 @@ static void VULKAN_DownloadFromTexture( &imageCopy ); + VULKAN_INTERNAL_ImageMemoryBarrier( + renderer, + vulkanCommandBuffer->commandBuffer, + originalTextureSliceAccessType, + vulkanTextureSlice + ); + + VULKAN_INTERNAL_BufferMemoryBarrier( + renderer, + vulkanCommandBuffer->commandBuffer, + originalBufferAccessType, + transferBufferContainer->activeBufferHandle->vulkanBuffer); + VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, transferBufferContainer->activeBufferHandle->vulkanBuffer); VULKAN_INTERNAL_TrackTextureSlice(renderer, vulkanCommandBuffer, vulkanTextureSlice); VULKAN_INTERNAL_TrackCopiedTextureSlice(renderer, vulkanCommandBuffer, vulkanTextureSlice); @@ -10283,6 +10301,8 @@ static void VULKAN_DownloadFromBuffer( VkBufferCopy bufferCopy; Refresh_Fence *fence; VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) VULKAN_AcquireCommandBuffer(driverData); + VulkanResourceAccessType originalTransferBufferAccessType; + VulkanResourceAccessType originalGpuBufferAccessType; if ( transferOption == REFRESH_TRANSFEROPTIONS_SAFEDISCARD && @@ -10294,6 +10314,9 @@ static void VULKAN_DownloadFromBuffer( ); } + originalTransferBufferAccessType = transferBufferContainer->activeBufferHandle->vulkanBuffer->resourceAccessType; + originalGpuBufferAccessType = gpuBufferContainer->activeBufferHandle->vulkanBuffer->resourceAccessType; + VULKAN_INTERNAL_BufferMemoryBarrier( renderer, vulkanCommandBuffer->commandBuffer, @@ -10320,6 +10343,19 @@ static void VULKAN_DownloadFromBuffer( &bufferCopy ); + VULKAN_INTERNAL_BufferMemoryBarrier( + renderer, + vulkanCommandBuffer->commandBuffer, + originalTransferBufferAccessType, + transferBufferContainer->activeBufferHandle->vulkanBuffer + ); + + VULKAN_INTERNAL_BufferMemoryBarrier( + renderer, + vulkanCommandBuffer->commandBuffer, + originalGpuBufferAccessType, + gpuBufferContainer->activeBufferHandle->vulkanBuffer); + VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, transferBufferContainer->activeBufferHandle->vulkanBuffer); VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, gpuBufferContainer->activeBufferHandle->vulkanBuffer); VULKAN_INTERNAL_TrackCopiedBuffer(renderer, vulkanCommandBuffer, gpuBufferContainer->activeBufferHandle->vulkanBuffer);