modify readback API
continuous-integration/drone/push Build is failing
Details
continuous-integration/drone/push Build is failing
Details
parent
6ebfabcecf
commit
52d4c934f3
|
@ -1193,46 +1193,6 @@ REFRESHAPI void Refresh_UploadToBuffer(
|
||||||
Refresh_WriteOptions writeOption
|
Refresh_WriteOptions writeOption
|
||||||
);
|
);
|
||||||
|
|
||||||
/* GPU-to-CPU copies occur on the GPU timeline.
|
|
||||||
*
|
|
||||||
* You may NOT assume that the data in the TransferBuffer is fully copied
|
|
||||||
* until the command buffer has finished execution.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* transferOption:
|
|
||||||
* SAFEDISCARD:
|
|
||||||
* If this TransferBuffer has been used in commands that have not completed,
|
|
||||||
* the issued commands will still be valid at the cost of increased memory usage.
|
|
||||||
* You may NOT assume that any of the previous data is retained.
|
|
||||||
* If the TransferBuffer was not in use, this option is equivalent to OVERWRITE.
|
|
||||||
* It is not recommended to use this option with large TransferBuffers.
|
|
||||||
*
|
|
||||||
* OVERWRITE:
|
|
||||||
* Overwrites the data regardless of whether a command has been issued.
|
|
||||||
* Use this option with great care, as it can cause data races to occur!
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Downloads data from a texture to a TransferBuffer. */
|
|
||||||
REFRESHAPI void Refresh_DownloadFromTexture(
|
|
||||||
Refresh_Device *device,
|
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
|
||||||
Refresh_TextureRegion *textureRegion,
|
|
||||||
Refresh_TransferBuffer *transferBuffer,
|
|
||||||
Refresh_BufferImageCopy *copyParams,
|
|
||||||
Refresh_TransferOptions transferOption
|
|
||||||
);
|
|
||||||
|
|
||||||
/* Downloads data from a GpuBuffer object. */
|
|
||||||
REFRESHAPI void Refresh_DownloadFromBuffer(
|
|
||||||
Refresh_Device *device,
|
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
|
||||||
Refresh_GpuBuffer *gpuBuffer,
|
|
||||||
Refresh_TransferBuffer *transferBuffer,
|
|
||||||
Refresh_BufferCopy *copyParams,
|
|
||||||
Refresh_TransferOptions transferOption
|
|
||||||
);
|
|
||||||
|
|
||||||
/* GPU-to-GPU copies occur on the GPU timeline,
|
/* GPU-to-GPU copies occur on the GPU timeline,
|
||||||
* and you may assume the copy has finished in subsequent commands.
|
* and you may assume the copy has finished in subsequent commands.
|
||||||
*/
|
*/
|
||||||
|
@ -1401,6 +1361,49 @@ REFRESHAPI void Refresh_ReleaseFence(
|
||||||
Refresh_Fence *fence
|
Refresh_Fence *fence
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/* Readback */
|
||||||
|
|
||||||
|
/* GPU-to-CPU copies occur immediately on the CPU timeline.
|
||||||
|
*
|
||||||
|
* If you modify data on the GPU and then call these functions without calling Wait or WaitForFences first,
|
||||||
|
* the data will be undefined!
|
||||||
|
*
|
||||||
|
* Readback forces a sync point and is generally a bad thing to do.
|
||||||
|
* Only use these functions if you have exhausted all other options.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* transferOption:
|
||||||
|
* SAFEDISCARD:
|
||||||
|
* If this TransferBuffer has been used in commands that have not completed,
|
||||||
|
* the issued commands will still be valid at the cost of increased memory usage.
|
||||||
|
* You may NOT assume that any of the previous data is retained.
|
||||||
|
* If the TransferBuffer was not in use, this option is equivalent to OVERWRITE.
|
||||||
|
* It is not recommended to use this option with large TransferBuffers.
|
||||||
|
*
|
||||||
|
* OVERWRITE:
|
||||||
|
* Overwrites the data regardless of whether a command has been issued.
|
||||||
|
* Use this option with great care, as it can cause data races to occur!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Downloads data from a texture to a TransferBuffer. */
|
||||||
|
REFRESHAPI void Refresh_DownloadFromTexture(
|
||||||
|
Refresh_Device *device,
|
||||||
|
Refresh_TextureRegion *textureRegion,
|
||||||
|
Refresh_TransferBuffer *transferBuffer,
|
||||||
|
Refresh_BufferImageCopy *copyParams,
|
||||||
|
Refresh_TransferOptions transferOption
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Downloads data from a GpuBuffer object. */
|
||||||
|
REFRESHAPI void Refresh_DownloadFromBuffer(
|
||||||
|
Refresh_Device *device,
|
||||||
|
Refresh_GpuBuffer *gpuBuffer,
|
||||||
|
Refresh_TransferBuffer *transferBuffer,
|
||||||
|
Refresh_BufferCopy *copyParams,
|
||||||
|
Refresh_TransferOptions transferOption
|
||||||
|
);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
|
@ -824,44 +824,6 @@ void Refresh_UploadToBuffer(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Refresh_DownloadFromTexture(
|
|
||||||
Refresh_Device *device,
|
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
|
||||||
Refresh_TextureRegion *textureRegion,
|
|
||||||
Refresh_TransferBuffer *transferBuffer,
|
|
||||||
Refresh_BufferImageCopy *copyParams,
|
|
||||||
Refresh_TransferOptions transferOption
|
|
||||||
) {
|
|
||||||
NULL_RETURN(device);
|
|
||||||
device->DownloadFromTexture(
|
|
||||||
device->driverData,
|
|
||||||
commandBuffer,
|
|
||||||
textureRegion,
|
|
||||||
transferBuffer,
|
|
||||||
copyParams,
|
|
||||||
transferOption
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Refresh_DownloadFromBuffer(
|
|
||||||
Refresh_Device *device,
|
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
|
||||||
Refresh_GpuBuffer *gpuBuffer,
|
|
||||||
Refresh_TransferBuffer *transferBuffer,
|
|
||||||
Refresh_BufferCopy *copyParams,
|
|
||||||
Refresh_TransferOptions transferOption
|
|
||||||
) {
|
|
||||||
NULL_RETURN(device);
|
|
||||||
device->DownloadFromBuffer(
|
|
||||||
device->driverData,
|
|
||||||
commandBuffer,
|
|
||||||
gpuBuffer,
|
|
||||||
transferBuffer,
|
|
||||||
copyParams,
|
|
||||||
transferOption
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Refresh_CopyTextureToTexture(
|
void Refresh_CopyTextureToTexture(
|
||||||
Refresh_Device *device,
|
Refresh_Device *device,
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
Refresh_CommandBuffer *commandBuffer,
|
||||||
|
@ -1067,4 +1029,38 @@ void Refresh_ReleaseFence(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Refresh_DownloadFromTexture(
|
||||||
|
Refresh_Device *device,
|
||||||
|
Refresh_TextureRegion *textureRegion,
|
||||||
|
Refresh_TransferBuffer *transferBuffer,
|
||||||
|
Refresh_BufferImageCopy *copyParams,
|
||||||
|
Refresh_TransferOptions transferOption
|
||||||
|
) {
|
||||||
|
NULL_RETURN(device);
|
||||||
|
device->DownloadFromTexture(
|
||||||
|
device->driverData,
|
||||||
|
textureRegion,
|
||||||
|
transferBuffer,
|
||||||
|
copyParams,
|
||||||
|
transferOption
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Refresh_DownloadFromBuffer(
|
||||||
|
Refresh_Device *device,
|
||||||
|
Refresh_GpuBuffer *gpuBuffer,
|
||||||
|
Refresh_TransferBuffer *transferBuffer,
|
||||||
|
Refresh_BufferCopy *copyParams,
|
||||||
|
Refresh_TransferOptions transferOption
|
||||||
|
) {
|
||||||
|
NULL_RETURN(device);
|
||||||
|
device->DownloadFromBuffer(
|
||||||
|
device->driverData,
|
||||||
|
gpuBuffer,
|
||||||
|
transferBuffer,
|
||||||
|
copyParams,
|
||||||
|
transferOption
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/* vim: set noexpandtab shiftwidth=8 tabstop=8: */
|
/* vim: set noexpandtab shiftwidth=8 tabstop=8: */
|
||||||
|
|
|
@ -506,24 +506,6 @@ struct Refresh_Device
|
||||||
Refresh_WriteOptions writeOption
|
Refresh_WriteOptions writeOption
|
||||||
);
|
);
|
||||||
|
|
||||||
void (*DownloadFromTexture)(
|
|
||||||
Refresh_Renderer *driverData,
|
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
|
||||||
Refresh_TextureRegion *textureSlice,
|
|
||||||
Refresh_TransferBuffer *transferBuffer,
|
|
||||||
Refresh_BufferImageCopy *copyParams,
|
|
||||||
Refresh_TransferOptions transferOption
|
|
||||||
);
|
|
||||||
|
|
||||||
void (*DownloadFromBuffer)(
|
|
||||||
Refresh_Renderer *driverData,
|
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
|
||||||
Refresh_GpuBuffer *gpuBuffer,
|
|
||||||
Refresh_TransferBuffer *transferBuffer,
|
|
||||||
Refresh_BufferCopy *copyParams,
|
|
||||||
Refresh_TransferOptions transferOption
|
|
||||||
);
|
|
||||||
|
|
||||||
void (*CopyTextureToTexture)(
|
void (*CopyTextureToTexture)(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
Refresh_CommandBuffer *commandBuffer,
|
||||||
|
@ -619,6 +601,22 @@ struct Refresh_Device
|
||||||
Refresh_Fence *fence
|
Refresh_Fence *fence
|
||||||
);
|
);
|
||||||
|
|
||||||
|
void (*DownloadFromTexture)(
|
||||||
|
Refresh_Renderer *driverData,
|
||||||
|
Refresh_TextureRegion *textureSlice,
|
||||||
|
Refresh_TransferBuffer *transferBuffer,
|
||||||
|
Refresh_BufferImageCopy *copyParams,
|
||||||
|
Refresh_TransferOptions transferOption
|
||||||
|
);
|
||||||
|
|
||||||
|
void (*DownloadFromBuffer)(
|
||||||
|
Refresh_Renderer *driverData,
|
||||||
|
Refresh_GpuBuffer *gpuBuffer,
|
||||||
|
Refresh_TransferBuffer *transferBuffer,
|
||||||
|
Refresh_BufferCopy *copyParams,
|
||||||
|
Refresh_TransferOptions transferOption
|
||||||
|
);
|
||||||
|
|
||||||
/* Opaque pointer for the Driver */
|
/* Opaque pointer for the Driver */
|
||||||
Refresh_Renderer *driverData;
|
Refresh_Renderer *driverData;
|
||||||
};
|
};
|
||||||
|
|
|
@ -2069,14 +2069,12 @@ static void D3D11_UploadToBuffer(
|
||||||
|
|
||||||
static void D3D11_DownloadFromTexture(
|
static void D3D11_DownloadFromTexture(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
|
||||||
Refresh_TextureRegion *textureRegion,
|
Refresh_TextureRegion *textureRegion,
|
||||||
Refresh_TransferBuffer *transferBuffer,
|
Refresh_TransferBuffer *transferBuffer,
|
||||||
Refresh_BufferImageCopy *copyParams,
|
Refresh_BufferImageCopy *copyParams,
|
||||||
Refresh_TransferOptions transferOption
|
Refresh_TransferOptions transferOption
|
||||||
) {
|
) {
|
||||||
D3D11Renderer *renderer = (D3D11Renderer*) driverData;
|
D3D11Renderer *renderer = (D3D11Renderer*) driverData;
|
||||||
D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer*) commandBuffer;
|
|
||||||
D3D11TransferBufferContainer *container = (D3D11TransferBufferContainer*) transferBuffer;
|
D3D11TransferBufferContainer *container = (D3D11TransferBufferContainer*) transferBuffer;
|
||||||
D3D11TransferBuffer *d3d11TransferBuffer = container->activeBuffer;
|
D3D11TransferBuffer *d3d11TransferBuffer = container->activeBuffer;
|
||||||
D3D11Texture *d3d11Texture = (D3D11Texture*) textureRegion->textureSlice.texture;
|
D3D11Texture *d3d11Texture = (D3D11Texture*) textureRegion->textureSlice.texture;
|
||||||
|
@ -2126,8 +2124,10 @@ static void D3D11_DownloadFromTexture(
|
||||||
);
|
);
|
||||||
ERROR_CHECK_RETURN("Staging texture creation failed",)
|
ERROR_CHECK_RETURN("Staging texture creation failed",)
|
||||||
|
|
||||||
ID3D11DeviceContext1_CopySubresourceRegion1(
|
/* Readback is only possible on CPU timeline in D3D11 */
|
||||||
d3d11CommandBuffer->context,
|
SDL_LockMutex(renderer->contextLock);
|
||||||
|
ID3D11DeviceContext_CopySubresourceRegion(
|
||||||
|
renderer->immediateContext,
|
||||||
stagingTexture,
|
stagingTexture,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
@ -2135,13 +2135,12 @@ static void D3D11_DownloadFromTexture(
|
||||||
0,
|
0,
|
||||||
d3d11Texture->handle,
|
d3d11Texture->handle,
|
||||||
subresourceIndex,
|
subresourceIndex,
|
||||||
&srcBox,
|
&srcBox
|
||||||
D3D11_COPY_NO_OVERWRITE
|
|
||||||
);
|
);
|
||||||
|
|
||||||
/* Read from the staging texture */
|
/* Read from the staging texture */
|
||||||
res = ID3D11DeviceContext1_Map(
|
res = ID3D11DeviceContext_Map(
|
||||||
d3d11CommandBuffer->context,
|
renderer->immediateContext,
|
||||||
stagingTexture,
|
stagingTexture,
|
||||||
subresourceIndex,
|
subresourceIndex,
|
||||||
D3D11_MAP_READ,
|
D3D11_MAP_READ,
|
||||||
|
@ -2170,24 +2169,24 @@ static void D3D11_DownloadFromTexture(
|
||||||
}
|
}
|
||||||
|
|
||||||
ID3D11DeviceContext1_Unmap(
|
ID3D11DeviceContext1_Unmap(
|
||||||
d3d11CommandBuffer->context,
|
renderer->immediateContext,
|
||||||
stagingTexture,
|
stagingTexture,
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
|
SDL_UnlockMutex(renderer->contextLock);
|
||||||
|
|
||||||
|
/* Clean up the staging texture */
|
||||||
ID3D11Texture2D_Release(stagingTexture);
|
ID3D11Texture2D_Release(stagingTexture);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void D3D11_DownloadFromBuffer(
|
static void D3D11_DownloadFromBuffer(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
|
||||||
Refresh_GpuBuffer *gpuBuffer,
|
Refresh_GpuBuffer *gpuBuffer,
|
||||||
Refresh_TransferBuffer *transferBuffer,
|
Refresh_TransferBuffer *transferBuffer,
|
||||||
Refresh_BufferCopy *copyParams,
|
Refresh_BufferCopy *copyParams,
|
||||||
Refresh_TransferOptions transferOption
|
Refresh_TransferOptions transferOption
|
||||||
) {
|
) {
|
||||||
D3D11Renderer *renderer = (D3D11Renderer*) driverData;
|
D3D11Renderer *renderer = (D3D11Renderer*) driverData;
|
||||||
D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer*) commandBuffer;
|
|
||||||
D3D11TransferBufferContainer *container = (D3D11TransferBufferContainer*) transferBuffer;
|
D3D11TransferBufferContainer *container = (D3D11TransferBufferContainer*) transferBuffer;
|
||||||
D3D11TransferBuffer *d3d11TransferBuffer = container->activeBuffer;
|
D3D11TransferBuffer *d3d11TransferBuffer = container->activeBuffer;
|
||||||
D3D11Buffer *d3d11Buffer = (D3D11Buffer*) gpuBuffer;
|
D3D11Buffer *d3d11Buffer = (D3D11Buffer*) gpuBuffer;
|
||||||
|
@ -2225,8 +2224,10 @@ static void D3D11_DownloadFromBuffer(
|
||||||
);
|
);
|
||||||
ERROR_CHECK_RETURN("Could not create staging buffer for readback", );
|
ERROR_CHECK_RETURN("Could not create staging buffer for readback", );
|
||||||
|
|
||||||
ID3D11DeviceContext1_CopySubresourceRegion1(
|
/* Readback is only possible on CPU timeline in D3D11 */
|
||||||
d3d11CommandBuffer->context,
|
SDL_LockMutex(renderer->contextLock);
|
||||||
|
ID3D11DeviceContext_CopySubresourceRegion(
|
||||||
|
renderer->immediateContext,
|
||||||
(ID3D11Resource*) stagingBuffer,
|
(ID3D11Resource*) stagingBuffer,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
@ -2234,13 +2235,12 @@ static void D3D11_DownloadFromBuffer(
|
||||||
0,
|
0,
|
||||||
(ID3D11Resource*) d3d11Buffer->handle,
|
(ID3D11Resource*) d3d11Buffer->handle,
|
||||||
0,
|
0,
|
||||||
&srcBox,
|
&srcBox
|
||||||
D3D11_COPY_NO_OVERWRITE
|
|
||||||
);
|
);
|
||||||
|
|
||||||
/* Read from the staging buffer */
|
/* Read from the staging buffer */
|
||||||
res = ID3D11DeviceContext1_Map(
|
res = ID3D11DeviceContext_Map(
|
||||||
d3d11CommandBuffer->context,
|
renderer->immediateContext,
|
||||||
stagingBuffer,
|
stagingBuffer,
|
||||||
0,
|
0,
|
||||||
D3D11_MAP_READ,
|
D3D11_MAP_READ,
|
||||||
|
@ -2265,12 +2265,11 @@ static void D3D11_DownloadFromBuffer(
|
||||||
);
|
);
|
||||||
|
|
||||||
ID3D11DeviceContext1_Unmap(
|
ID3D11DeviceContext1_Unmap(
|
||||||
d3d11CommandBuffer->context,
|
renderer->immediateContext,
|
||||||
stagingBuffer,
|
stagingBuffer,
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
|
SDL_UnlockMutex(renderer->contextLock);
|
||||||
D3D11_INTERNAL_TrackTransferBuffer(d3d11CommandBuffer, d3d11TransferBuffer);
|
|
||||||
|
|
||||||
/* Clean up the staging buffer */
|
/* Clean up the staging buffer */
|
||||||
ID3D11Buffer_Release(stagingBuffer);
|
ID3D11Buffer_Release(stagingBuffer);
|
||||||
|
|
|
@ -8550,130 +8550,6 @@ static void VULKAN_UploadToBuffer(
|
||||||
VULKAN_INTERNAL_TrackCopiedBuffer(renderer, vulkanCommandBuffer, gpuBufferContainer->activeBufferHandle->vulkanBuffer);
|
VULKAN_INTERNAL_TrackCopiedBuffer(renderer, vulkanCommandBuffer, gpuBufferContainer->activeBufferHandle->vulkanBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void VULKAN_DownloadFromTexture(
|
|
||||||
Refresh_Renderer *driverData,
|
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
|
||||||
Refresh_TextureRegion *textureRegion,
|
|
||||||
Refresh_TransferBuffer *transferBuffer,
|
|
||||||
Refresh_BufferImageCopy *copyParams,
|
|
||||||
Refresh_TransferOptions transferOption
|
|
||||||
) {
|
|
||||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
|
||||||
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
|
||||||
VulkanTextureSlice *vulkanTextureSlice;
|
|
||||||
VulkanBufferContainer *transferBufferContainer = (VulkanBufferContainer*) transferBuffer;
|
|
||||||
VkBufferImageCopy imageCopy;
|
|
||||||
|
|
||||||
vulkanTextureSlice = VULKAN_INTERNAL_RefreshToVulkanTextureSlice(&textureRegion->textureSlice);
|
|
||||||
|
|
||||||
if (
|
|
||||||
transferOption == REFRESH_TRANSFEROPTIONS_SAFEDISCARD &&
|
|
||||||
SDL_AtomicGet(&transferBufferContainer->activeBufferHandle->vulkanBuffer->referenceCount) > 0
|
|
||||||
) {
|
|
||||||
VULKAN_INTERNAL_DiscardActiveBuffer(
|
|
||||||
renderer,
|
|
||||||
transferBufferContainer
|
|
||||||
);
|
|
||||||
vulkanTextureSlice = VULKAN_INTERNAL_RefreshToVulkanTextureSlice(&textureRegion->textureSlice);
|
|
||||||
}
|
|
||||||
|
|
||||||
VULKAN_INTERNAL_BufferMemoryBarrier(
|
|
||||||
renderer,
|
|
||||||
vulkanCommandBuffer->commandBuffer,
|
|
||||||
RESOURCE_ACCESS_TRANSFER_WRITE,
|
|
||||||
transferBufferContainer->activeBufferHandle->vulkanBuffer
|
|
||||||
);
|
|
||||||
|
|
||||||
VULKAN_INTERNAL_ImageMemoryBarrier(
|
|
||||||
renderer,
|
|
||||||
vulkanCommandBuffer->commandBuffer,
|
|
||||||
RESOURCE_ACCESS_TRANSFER_READ,
|
|
||||||
vulkanTextureSlice
|
|
||||||
);
|
|
||||||
|
|
||||||
imageCopy.imageExtent.width = textureRegion->w;
|
|
||||||
imageCopy.imageExtent.height = textureRegion->h;
|
|
||||||
imageCopy.imageExtent.depth = textureRegion->d;
|
|
||||||
imageCopy.imageOffset.x = textureRegion->x;
|
|
||||||
imageCopy.imageOffset.y = textureRegion->y;
|
|
||||||
imageCopy.imageOffset.z = textureRegion->z;
|
|
||||||
imageCopy.imageSubresource.aspectMask = vulkanTextureSlice->parent->aspectFlags;
|
|
||||||
imageCopy.imageSubresource.baseArrayLayer = textureRegion->textureSlice.layer;
|
|
||||||
imageCopy.imageSubresource.layerCount = 1;
|
|
||||||
imageCopy.imageSubresource.mipLevel = textureRegion->textureSlice.mipLevel;
|
|
||||||
imageCopy.bufferOffset = copyParams->bufferOffset;
|
|
||||||
imageCopy.bufferRowLength = copyParams->bufferStride;
|
|
||||||
imageCopy.bufferImageHeight = copyParams->bufferImageHeight;
|
|
||||||
|
|
||||||
renderer->vkCmdCopyImageToBuffer(
|
|
||||||
vulkanCommandBuffer->commandBuffer,
|
|
||||||
vulkanTextureSlice->parent->image,
|
|
||||||
AccessMap[vulkanTextureSlice->resourceAccessType].imageLayout,
|
|
||||||
transferBufferContainer->activeBufferHandle->vulkanBuffer->buffer,
|
|
||||||
1,
|
|
||||||
&imageCopy
|
|
||||||
);
|
|
||||||
|
|
||||||
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, transferBufferContainer->activeBufferHandle->vulkanBuffer);
|
|
||||||
VULKAN_INTERNAL_TrackTextureSlice(renderer, vulkanCommandBuffer, vulkanTextureSlice);
|
|
||||||
VULKAN_INTERNAL_TrackCopiedTextureSlice(renderer, vulkanCommandBuffer, vulkanTextureSlice);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void VULKAN_DownloadFromBuffer(
|
|
||||||
Refresh_Renderer *driverData,
|
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
|
||||||
Refresh_GpuBuffer *gpuBuffer,
|
|
||||||
Refresh_TransferBuffer *transferBuffer,
|
|
||||||
Refresh_BufferCopy *copyParams,
|
|
||||||
Refresh_TransferOptions transferOption
|
|
||||||
) {
|
|
||||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
|
||||||
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
|
||||||
VulkanBufferContainer *gpuBufferContainer = (VulkanBufferContainer*) gpuBuffer;
|
|
||||||
VulkanBufferContainer *transferBufferContainer = (VulkanBufferContainer*) transferBuffer;
|
|
||||||
VkBufferCopy bufferCopy;
|
|
||||||
|
|
||||||
if (
|
|
||||||
transferOption == REFRESH_TRANSFEROPTIONS_SAFEDISCARD &&
|
|
||||||
SDL_AtomicGet(&transferBufferContainer->activeBufferHandle->vulkanBuffer->referenceCount) > 0
|
|
||||||
) {
|
|
||||||
VULKAN_INTERNAL_DiscardActiveBuffer(
|
|
||||||
renderer,
|
|
||||||
transferBufferContainer
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
VULKAN_INTERNAL_BufferMemoryBarrier(
|
|
||||||
renderer,
|
|
||||||
vulkanCommandBuffer->commandBuffer,
|
|
||||||
RESOURCE_ACCESS_TRANSFER_WRITE,
|
|
||||||
transferBufferContainer->activeBufferHandle->vulkanBuffer
|
|
||||||
);
|
|
||||||
|
|
||||||
VULKAN_INTERNAL_BufferMemoryBarrier(
|
|
||||||
renderer,
|
|
||||||
vulkanCommandBuffer->commandBuffer,
|
|
||||||
RESOURCE_ACCESS_TRANSFER_READ,
|
|
||||||
gpuBufferContainer->activeBufferHandle->vulkanBuffer
|
|
||||||
);
|
|
||||||
|
|
||||||
bufferCopy.srcOffset = copyParams->srcOffset;
|
|
||||||
bufferCopy.dstOffset = copyParams->dstOffset;
|
|
||||||
bufferCopy.size = copyParams->size;
|
|
||||||
|
|
||||||
renderer->vkCmdCopyBuffer(
|
|
||||||
vulkanCommandBuffer->commandBuffer,
|
|
||||||
gpuBufferContainer->activeBufferHandle->vulkanBuffer->buffer,
|
|
||||||
transferBufferContainer->activeBufferHandle->vulkanBuffer->buffer,
|
|
||||||
1,
|
|
||||||
&bufferCopy
|
|
||||||
);
|
|
||||||
|
|
||||||
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, transferBufferContainer->activeBufferHandle->vulkanBuffer);
|
|
||||||
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, gpuBufferContainer->activeBufferHandle->vulkanBuffer);
|
|
||||||
VULKAN_INTERNAL_TrackCopiedBuffer(renderer, vulkanCommandBuffer, gpuBufferContainer->activeBufferHandle->vulkanBuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void VULKAN_CopyTextureToTexture(
|
static void VULKAN_CopyTextureToTexture(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
Refresh_CommandBuffer *commandBuffer,
|
||||||
|
@ -8751,147 +8627,6 @@ static void VULKAN_CopyTextureToTexture(
|
||||||
VULKAN_INTERNAL_TrackCopiedTextureSlice(renderer, vulkanCommandBuffer, dstSlice);
|
VULKAN_INTERNAL_TrackCopiedTextureSlice(renderer, vulkanCommandBuffer, dstSlice);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void VULKAN_CopyTextureToBuffer(
|
|
||||||
Refresh_Renderer *driverData,
|
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
|
||||||
Refresh_TextureRegion *textureRegion,
|
|
||||||
Refresh_GpuBuffer *gpuBuffer,
|
|
||||||
Refresh_BufferImageCopy *copyParams,
|
|
||||||
Refresh_WriteOptions writeOption
|
|
||||||
) {
|
|
||||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
|
||||||
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
|
||||||
VulkanTextureSlice *vulkanTextureSlice;
|
|
||||||
VulkanBufferContainer *bufferContainer = (VulkanBufferContainer*) gpuBuffer;
|
|
||||||
VkBufferImageCopy imageCopy;
|
|
||||||
|
|
||||||
vulkanTextureSlice = VULKAN_INTERNAL_RefreshToVulkanTextureSlice(&textureRegion->textureSlice);
|
|
||||||
|
|
||||||
if (
|
|
||||||
writeOption == REFRESH_WRITEOPTIONS_SAFEDISCARD &&
|
|
||||||
SDL_AtomicGet(&bufferContainer->activeBufferHandle->vulkanBuffer->referenceCount) > 0
|
|
||||||
) {
|
|
||||||
VULKAN_INTERNAL_DiscardActiveBuffer(
|
|
||||||
renderer,
|
|
||||||
bufferContainer
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
VULKAN_INTERNAL_ImageMemoryBarrier(
|
|
||||||
renderer,
|
|
||||||
vulkanCommandBuffer->commandBuffer,
|
|
||||||
RESOURCE_ACCESS_TRANSFER_READ,
|
|
||||||
vulkanTextureSlice
|
|
||||||
);
|
|
||||||
|
|
||||||
VULKAN_INTERNAL_BufferMemoryBarrier(
|
|
||||||
renderer,
|
|
||||||
vulkanCommandBuffer->commandBuffer,
|
|
||||||
RESOURCE_ACCESS_TRANSFER_WRITE,
|
|
||||||
bufferContainer->activeBufferHandle->vulkanBuffer
|
|
||||||
);
|
|
||||||
|
|
||||||
imageCopy.imageExtent.width = textureRegion->w;
|
|
||||||
imageCopy.imageExtent.height = textureRegion->h;
|
|
||||||
imageCopy.imageExtent.depth = textureRegion->d;
|
|
||||||
imageCopy.imageOffset.x = textureRegion->x;
|
|
||||||
imageCopy.imageOffset.y = textureRegion->y;
|
|
||||||
imageCopy.imageOffset.z = textureRegion->z;
|
|
||||||
imageCopy.imageSubresource.aspectMask = vulkanTextureSlice->parent->aspectFlags;
|
|
||||||
imageCopy.imageSubresource.baseArrayLayer = textureRegion->textureSlice.layer;
|
|
||||||
imageCopy.imageSubresource.layerCount = 1;
|
|
||||||
imageCopy.imageSubresource.mipLevel = textureRegion->textureSlice.mipLevel;
|
|
||||||
imageCopy.bufferOffset = copyParams->bufferOffset;
|
|
||||||
imageCopy.bufferRowLength = copyParams->bufferStride;
|
|
||||||
imageCopy.bufferImageHeight = copyParams->bufferImageHeight;
|
|
||||||
|
|
||||||
renderer->vkCmdCopyImageToBuffer(
|
|
||||||
vulkanCommandBuffer->commandBuffer,
|
|
||||||
vulkanTextureSlice->parent->image,
|
|
||||||
AccessMap[vulkanTextureSlice->resourceAccessType].imageLayout,
|
|
||||||
bufferContainer->activeBufferHandle->vulkanBuffer->buffer,
|
|
||||||
1,
|
|
||||||
&imageCopy
|
|
||||||
);
|
|
||||||
|
|
||||||
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, bufferContainer->activeBufferHandle->vulkanBuffer);
|
|
||||||
VULKAN_INTERNAL_TrackTextureSlice(renderer, vulkanCommandBuffer, vulkanTextureSlice);
|
|
||||||
VULKAN_INTERNAL_TrackCopiedBuffer(renderer, vulkanCommandBuffer, bufferContainer->activeBufferHandle->vulkanBuffer);
|
|
||||||
VULKAN_INTERNAL_TrackCopiedTextureSlice(renderer, vulkanCommandBuffer, vulkanTextureSlice);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void VULKAN_CopyBufferToTexture(
|
|
||||||
Refresh_Renderer *driverData,
|
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
|
||||||
Refresh_GpuBuffer *gpuBuffer,
|
|
||||||
Refresh_TextureRegion *textureRegion,
|
|
||||||
Refresh_BufferImageCopy *copyParams,
|
|
||||||
Refresh_WriteOptions writeOption
|
|
||||||
) {
|
|
||||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
|
||||||
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
|
||||||
VulkanBufferContainer *bufferContainer = (VulkanBufferContainer*) gpuBuffer;
|
|
||||||
VulkanTextureContainer *textureContainer = (VulkanTextureContainer*) textureRegion->textureSlice.texture;
|
|
||||||
VulkanTextureSlice *vulkanTextureSlice;
|
|
||||||
VkBufferImageCopy imageCopy;
|
|
||||||
|
|
||||||
vulkanTextureSlice = VULKAN_INTERNAL_RefreshToVulkanTextureSlice(&textureRegion->textureSlice);
|
|
||||||
|
|
||||||
if (
|
|
||||||
writeOption == REFRESH_WRITEOPTIONS_SAFEDISCARD &&
|
|
||||||
textureContainer->canBeDiscarded &&
|
|
||||||
SDL_AtomicGet(&vulkanTextureSlice->referenceCount) > 0
|
|
||||||
) {
|
|
||||||
VULKAN_INTERNAL_DiscardActiveTexture(
|
|
||||||
renderer,
|
|
||||||
textureContainer
|
|
||||||
);
|
|
||||||
vulkanTextureSlice = VULKAN_INTERNAL_RefreshToVulkanTextureSlice(&textureRegion->textureSlice);
|
|
||||||
}
|
|
||||||
|
|
||||||
VULKAN_INTERNAL_BufferMemoryBarrier(
|
|
||||||
renderer,
|
|
||||||
vulkanCommandBuffer->commandBuffer,
|
|
||||||
RESOURCE_ACCESS_TRANSFER_READ,
|
|
||||||
bufferContainer->activeBufferHandle->vulkanBuffer
|
|
||||||
);
|
|
||||||
|
|
||||||
VULKAN_INTERNAL_ImageMemoryBarrier(
|
|
||||||
renderer,
|
|
||||||
vulkanCommandBuffer->commandBuffer,
|
|
||||||
RESOURCE_ACCESS_TRANSFER_WRITE,
|
|
||||||
vulkanTextureSlice
|
|
||||||
);
|
|
||||||
|
|
||||||
imageCopy.imageExtent.width = textureRegion->w;
|
|
||||||
imageCopy.imageExtent.height = textureRegion->h;
|
|
||||||
imageCopy.imageExtent.depth = textureRegion->d;
|
|
||||||
imageCopy.imageOffset.x = textureRegion->x;
|
|
||||||
imageCopy.imageOffset.y = textureRegion->y;
|
|
||||||
imageCopy.imageOffset.z = textureRegion->z;
|
|
||||||
imageCopy.imageSubresource.aspectMask = vulkanTextureSlice->parent->aspectFlags;
|
|
||||||
imageCopy.imageSubresource.baseArrayLayer = textureRegion->textureSlice.layer;
|
|
||||||
imageCopy.imageSubresource.layerCount = 1;
|
|
||||||
imageCopy.imageSubresource.mipLevel = textureRegion->textureSlice.mipLevel;
|
|
||||||
imageCopy.bufferOffset = copyParams->bufferOffset;
|
|
||||||
imageCopy.bufferRowLength = copyParams->bufferStride;
|
|
||||||
imageCopy.bufferImageHeight = copyParams->bufferImageHeight;
|
|
||||||
|
|
||||||
renderer->vkCmdCopyBufferToImage(
|
|
||||||
vulkanCommandBuffer->commandBuffer,
|
|
||||||
bufferContainer->activeBufferHandle->vulkanBuffer->buffer,
|
|
||||||
vulkanTextureSlice->parent->image,
|
|
||||||
AccessMap[vulkanTextureSlice->resourceAccessType].imageLayout,
|
|
||||||
1,
|
|
||||||
&imageCopy
|
|
||||||
);
|
|
||||||
|
|
||||||
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, bufferContainer->activeBufferHandle->vulkanBuffer);
|
|
||||||
VULKAN_INTERNAL_TrackTextureSlice(renderer, vulkanCommandBuffer, vulkanTextureSlice);
|
|
||||||
VULKAN_INTERNAL_TrackCopiedBuffer(renderer, vulkanCommandBuffer, bufferContainer->activeBufferHandle->vulkanBuffer);
|
|
||||||
VULKAN_INTERNAL_TrackCopiedTextureSlice(renderer, vulkanCommandBuffer, vulkanTextureSlice);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void VULKAN_CopyBufferToBuffer(
|
static void VULKAN_CopyBufferToBuffer(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
Refresh_CommandBuffer *commandBuffer,
|
||||||
|
@ -10461,6 +10196,137 @@ static void VULKAN_ReleaseFence(
|
||||||
VULKAN_INTERNAL_ReturnFenceToPool((VulkanRenderer*) driverData, (VkFence) fence);
|
VULKAN_INTERNAL_ReturnFenceToPool((VulkanRenderer*) driverData, (VkFence) fence);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Readback */
|
||||||
|
|
||||||
|
static void VULKAN_DownloadFromTexture(
|
||||||
|
Refresh_Renderer *driverData,
|
||||||
|
Refresh_TextureRegion *textureRegion,
|
||||||
|
Refresh_TransferBuffer *transferBuffer,
|
||||||
|
Refresh_BufferImageCopy *copyParams,
|
||||||
|
Refresh_TransferOptions transferOption
|
||||||
|
) {
|
||||||
|
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||||
|
VulkanTextureSlice *vulkanTextureSlice;
|
||||||
|
VulkanBufferContainer *transferBufferContainer = (VulkanBufferContainer*) transferBuffer;
|
||||||
|
VkBufferImageCopy imageCopy;
|
||||||
|
vulkanTextureSlice = VULKAN_INTERNAL_RefreshToVulkanTextureSlice(&textureRegion->textureSlice);
|
||||||
|
Refresh_Fence *fence;
|
||||||
|
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) VULKAN_AcquireCommandBuffer(driverData);
|
||||||
|
|
||||||
|
if (
|
||||||
|
transferOption == REFRESH_TRANSFEROPTIONS_SAFEDISCARD &&
|
||||||
|
SDL_AtomicGet(&transferBufferContainer->activeBufferHandle->vulkanBuffer->referenceCount) > 0
|
||||||
|
) {
|
||||||
|
VULKAN_INTERNAL_DiscardActiveBuffer(
|
||||||
|
renderer,
|
||||||
|
transferBufferContainer
|
||||||
|
);
|
||||||
|
vulkanTextureSlice = VULKAN_INTERNAL_RefreshToVulkanTextureSlice(&textureRegion->textureSlice);
|
||||||
|
}
|
||||||
|
|
||||||
|
VULKAN_INTERNAL_BufferMemoryBarrier(
|
||||||
|
renderer,
|
||||||
|
vulkanCommandBuffer->commandBuffer,
|
||||||
|
RESOURCE_ACCESS_TRANSFER_WRITE,
|
||||||
|
transferBufferContainer->activeBufferHandle->vulkanBuffer
|
||||||
|
);
|
||||||
|
|
||||||
|
VULKAN_INTERNAL_ImageMemoryBarrier(
|
||||||
|
renderer,
|
||||||
|
vulkanCommandBuffer->commandBuffer,
|
||||||
|
RESOURCE_ACCESS_TRANSFER_READ,
|
||||||
|
vulkanTextureSlice
|
||||||
|
);
|
||||||
|
|
||||||
|
imageCopy.imageExtent.width = textureRegion->w;
|
||||||
|
imageCopy.imageExtent.height = textureRegion->h;
|
||||||
|
imageCopy.imageExtent.depth = textureRegion->d;
|
||||||
|
imageCopy.imageOffset.x = textureRegion->x;
|
||||||
|
imageCopy.imageOffset.y = textureRegion->y;
|
||||||
|
imageCopy.imageOffset.z = textureRegion->z;
|
||||||
|
imageCopy.imageSubresource.aspectMask = vulkanTextureSlice->parent->aspectFlags;
|
||||||
|
imageCopy.imageSubresource.baseArrayLayer = textureRegion->textureSlice.layer;
|
||||||
|
imageCopy.imageSubresource.layerCount = 1;
|
||||||
|
imageCopy.imageSubresource.mipLevel = textureRegion->textureSlice.mipLevel;
|
||||||
|
imageCopy.bufferOffset = copyParams->bufferOffset;
|
||||||
|
imageCopy.bufferRowLength = copyParams->bufferStride;
|
||||||
|
imageCopy.bufferImageHeight = copyParams->bufferImageHeight;
|
||||||
|
|
||||||
|
renderer->vkCmdCopyImageToBuffer(
|
||||||
|
vulkanCommandBuffer->commandBuffer,
|
||||||
|
vulkanTextureSlice->parent->image,
|
||||||
|
AccessMap[vulkanTextureSlice->resourceAccessType].imageLayout,
|
||||||
|
transferBufferContainer->activeBufferHandle->vulkanBuffer->buffer,
|
||||||
|
1,
|
||||||
|
&imageCopy
|
||||||
|
);
|
||||||
|
|
||||||
|
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, transferBufferContainer->activeBufferHandle->vulkanBuffer);
|
||||||
|
VULKAN_INTERNAL_TrackTextureSlice(renderer, vulkanCommandBuffer, vulkanTextureSlice);
|
||||||
|
VULKAN_INTERNAL_TrackCopiedTextureSlice(renderer, vulkanCommandBuffer, vulkanTextureSlice);
|
||||||
|
|
||||||
|
fence = VULKAN_SubmitAndAcquireFence(driverData, (Refresh_CommandBuffer*) vulkanCommandBuffer);
|
||||||
|
VULKAN_WaitForFences(driverData, 1, 1, &fence);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void VULKAN_DownloadFromBuffer(
|
||||||
|
Refresh_Renderer *driverData,
|
||||||
|
Refresh_GpuBuffer *gpuBuffer,
|
||||||
|
Refresh_TransferBuffer *transferBuffer,
|
||||||
|
Refresh_BufferCopy *copyParams,
|
||||||
|
Refresh_TransferOptions transferOption
|
||||||
|
) {
|
||||||
|
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||||
|
VulkanBufferContainer *gpuBufferContainer = (VulkanBufferContainer*) gpuBuffer;
|
||||||
|
VulkanBufferContainer *transferBufferContainer = (VulkanBufferContainer*) transferBuffer;
|
||||||
|
VkBufferCopy bufferCopy;
|
||||||
|
Refresh_Fence *fence;
|
||||||
|
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) VULKAN_AcquireCommandBuffer(driverData);
|
||||||
|
|
||||||
|
if (
|
||||||
|
transferOption == REFRESH_TRANSFEROPTIONS_SAFEDISCARD &&
|
||||||
|
SDL_AtomicGet(&transferBufferContainer->activeBufferHandle->vulkanBuffer->referenceCount) > 0
|
||||||
|
) {
|
||||||
|
VULKAN_INTERNAL_DiscardActiveBuffer(
|
||||||
|
renderer,
|
||||||
|
transferBufferContainer
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
VULKAN_INTERNAL_BufferMemoryBarrier(
|
||||||
|
renderer,
|
||||||
|
vulkanCommandBuffer->commandBuffer,
|
||||||
|
RESOURCE_ACCESS_TRANSFER_WRITE,
|
||||||
|
transferBufferContainer->activeBufferHandle->vulkanBuffer
|
||||||
|
);
|
||||||
|
|
||||||
|
VULKAN_INTERNAL_BufferMemoryBarrier(
|
||||||
|
renderer,
|
||||||
|
vulkanCommandBuffer->commandBuffer,
|
||||||
|
RESOURCE_ACCESS_TRANSFER_READ,
|
||||||
|
gpuBufferContainer->activeBufferHandle->vulkanBuffer
|
||||||
|
);
|
||||||
|
|
||||||
|
bufferCopy.srcOffset = copyParams->srcOffset;
|
||||||
|
bufferCopy.dstOffset = copyParams->dstOffset;
|
||||||
|
bufferCopy.size = copyParams->size;
|
||||||
|
|
||||||
|
renderer->vkCmdCopyBuffer(
|
||||||
|
vulkanCommandBuffer->commandBuffer,
|
||||||
|
gpuBufferContainer->activeBufferHandle->vulkanBuffer->buffer,
|
||||||
|
transferBufferContainer->activeBufferHandle->vulkanBuffer->buffer,
|
||||||
|
1,
|
||||||
|
&bufferCopy
|
||||||
|
);
|
||||||
|
|
||||||
|
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, transferBufferContainer->activeBufferHandle->vulkanBuffer);
|
||||||
|
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, gpuBufferContainer->activeBufferHandle->vulkanBuffer);
|
||||||
|
VULKAN_INTERNAL_TrackCopiedBuffer(renderer, vulkanCommandBuffer, gpuBufferContainer->activeBufferHandle->vulkanBuffer);
|
||||||
|
|
||||||
|
fence = VULKAN_SubmitAndAcquireFence(driverData, (Refresh_CommandBuffer*) vulkanCommandBuffer);
|
||||||
|
VULKAN_WaitForFences(driverData, 1, 1, &fence);
|
||||||
|
}
|
||||||
|
|
||||||
/* Device instantiation */
|
/* Device instantiation */
|
||||||
|
|
||||||
static inline uint8_t CheckDeviceExtensions(
|
static inline uint8_t CheckDeviceExtensions(
|
||||||
|
|
Loading…
Reference in New Issue