implementing some transfer structure
continuous-integration/drone/push Build is failing
Details
continuous-integration/drone/push Build is failing
Details
parent
e01cab47ec
commit
52ac3e1980
|
@ -437,8 +437,7 @@ typedef struct D3D11Buffer
|
||||||
|
|
||||||
typedef struct D3D11TransferBuffer
|
typedef struct D3D11TransferBuffer
|
||||||
{
|
{
|
||||||
uint8_t *data;
|
D3D11Buffer buffer;
|
||||||
uint32_t size;
|
|
||||||
SDL_atomic_t referenceCount;
|
SDL_atomic_t referenceCount;
|
||||||
} D3D11TransferBuffer;
|
} D3D11TransferBuffer;
|
||||||
|
|
||||||
|
@ -1827,12 +1826,34 @@ static void D3D11_INTERNAL_TrackTransferBuffer(
|
||||||
}
|
}
|
||||||
|
|
||||||
static D3D11TransferBuffer* D3D11_INTERNAL_CreateTransferBuffer(
|
static D3D11TransferBuffer* D3D11_INTERNAL_CreateTransferBuffer(
|
||||||
|
D3D11Renderer *renderer,
|
||||||
uint32_t sizeInBytes
|
uint32_t sizeInBytes
|
||||||
) {
|
) {
|
||||||
D3D11TransferBuffer *transferBuffer = (D3D11TransferBuffer*) SDL_malloc(sizeof(D3D11TransferBuffer));
|
D3D11TransferBuffer *transferBuffer;
|
||||||
|
D3D11_BUFFER_DESC bufferDesc;
|
||||||
|
ID3D11Buffer *bufferHandle;
|
||||||
|
HRESULT res;
|
||||||
|
|
||||||
|
bufferDesc.ByteWidth = sizeInBytes;
|
||||||
|
bufferDesc.Usage = D3D11_USAGE_STAGING;
|
||||||
|
bufferDesc.BindFlags = 0;
|
||||||
|
bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE | D3D11_CPU_ACCESS_READ;
|
||||||
|
bufferDesc.MiscFlags = 0;
|
||||||
|
bufferDesc.StructureByteStride = 0;
|
||||||
|
|
||||||
|
res = ID3D11Device_CreateBuffer(
|
||||||
|
renderer->device,
|
||||||
|
&bufferDesc,
|
||||||
|
NULL,
|
||||||
|
&bufferHandle
|
||||||
|
);
|
||||||
|
ERROR_CHECK_RETURN("Could not create buffer", NULL);
|
||||||
|
|
||||||
|
transferBuffer = (D3D11TransferBuffer*) SDL_malloc(sizeof(D3D11TransferBuffer));
|
||||||
|
transferBuffer->buffer.handle = bufferHandle;
|
||||||
|
transferBuffer->buffer.size = sizeInBytes;
|
||||||
|
transferBuffer->buffer.uav = NULL;
|
||||||
|
|
||||||
transferBuffer->data = SDL_malloc(sizeInBytes);
|
|
||||||
transferBuffer->size = sizeInBytes;
|
|
||||||
SDL_AtomicSet(&transferBuffer->referenceCount, 0);
|
SDL_AtomicSet(&transferBuffer->referenceCount, 0);
|
||||||
|
|
||||||
return transferBuffer;
|
return transferBuffer;
|
||||||
|
@ -1845,7 +1866,7 @@ static Refresh_TransferBuffer* D3D11_CreateTransferBuffer(
|
||||||
) {
|
) {
|
||||||
D3D11Renderer *renderer = (D3D11Renderer*) driverData;
|
D3D11Renderer *renderer = (D3D11Renderer*) driverData;
|
||||||
D3D11TransferBufferContainer *container = (D3D11TransferBufferContainer*) (sizeof(D3D11TransferBufferContainer));
|
D3D11TransferBufferContainer *container = (D3D11TransferBufferContainer*) (sizeof(D3D11TransferBufferContainer));
|
||||||
D3D11TransferBuffer *transferBuffer = D3D11_INTERNAL_CreateTransferBuffer(sizeInBytes);
|
D3D11TransferBuffer *transferBuffer = D3D11_INTERNAL_CreateTransferBuffer(renderer, sizeInBytes);
|
||||||
|
|
||||||
container->activeBuffer = transferBuffer;
|
container->activeBuffer = transferBuffer;
|
||||||
container->bufferCapacity = 1;
|
container->bufferCapacity = 1;
|
||||||
|
@ -1861,6 +1882,7 @@ static Refresh_TransferBuffer* D3D11_CreateTransferBuffer(
|
||||||
/* TransferBuffer Data */
|
/* TransferBuffer Data */
|
||||||
|
|
||||||
static void D3D11_INTERNAL_DiscardActiveTransferBuffer(
|
static void D3D11_INTERNAL_DiscardActiveTransferBuffer(
|
||||||
|
D3D11Renderer *renderer,
|
||||||
D3D11TransferBufferContainer *container
|
D3D11TransferBufferContainer *container
|
||||||
) {
|
) {
|
||||||
for (uint32_t i = 0; i < container->bufferCount; i += 1)
|
for (uint32_t i = 0; i < container->bufferCount; i += 1)
|
||||||
|
@ -1873,7 +1895,8 @@ static void D3D11_INTERNAL_DiscardActiveTransferBuffer(
|
||||||
}
|
}
|
||||||
|
|
||||||
container->activeBuffer = D3D11_INTERNAL_CreateTransferBuffer(
|
container->activeBuffer = D3D11_INTERNAL_CreateTransferBuffer(
|
||||||
container->activeBuffer->size
|
renderer,
|
||||||
|
container->activeBuffer->buffer.size
|
||||||
);
|
);
|
||||||
|
|
||||||
EXPAND_ARRAY_IF_NEEDED(
|
EXPAND_ARRAY_IF_NEEDED(
|
||||||
|
@ -1897,26 +1920,56 @@ static void D3D11_SetTransferData(
|
||||||
Refresh_BufferCopy *copyParams,
|
Refresh_BufferCopy *copyParams,
|
||||||
Refresh_TransferOptions transferOption
|
Refresh_TransferOptions transferOption
|
||||||
) {
|
) {
|
||||||
|
D3D11Renderer *renderer = (D3D11Renderer*) driverData;
|
||||||
D3D11TransferBufferContainer *container = (D3D11TransferBufferContainer*) transferBuffer;
|
D3D11TransferBufferContainer *container = (D3D11TransferBufferContainer*) transferBuffer;
|
||||||
D3D11TransferBuffer *buffer = container->activeBuffer;
|
D3D11TransferBuffer *buffer = container->activeBuffer;
|
||||||
|
D3D11_MAPPED_SUBRESOURCE mappedSubresource;
|
||||||
|
HRESULT res;
|
||||||
|
|
||||||
|
/* Rotate the transfer buffer if necessary */
|
||||||
if (
|
if (
|
||||||
transferOption == REFRESH_TRANSFEROPTIONS_SAFEDISCARD &&
|
transferOption == REFRESH_TRANSFEROPTIONS_SAFEDISCARD &&
|
||||||
SDL_AtomicGet(&container->activeBuffer->referenceCount) > 0
|
SDL_AtomicGet(&container->activeBuffer->referenceCount) > 0
|
||||||
) {
|
) {
|
||||||
D3D11_INTERNAL_DiscardActiveTransferBuffer(
|
D3D11_INTERNAL_DiscardActiveTransferBuffer(
|
||||||
|
renderer,
|
||||||
container
|
container
|
||||||
);
|
);
|
||||||
|
buffer = container->activeBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = ID3D11DeviceContext_Map(
|
||||||
|
renderer->immediateContext,
|
||||||
|
buffer->buffer.handle,
|
||||||
|
0,
|
||||||
|
D3D11_MAP_WRITE,
|
||||||
|
D3D11_MAP_FLAG_DO_NOT_WAIT,
|
||||||
|
&mappedSubresource
|
||||||
|
);
|
||||||
|
if (FAILED(res))
|
||||||
|
{
|
||||||
|
D3D11_INTERNAL_LogError(
|
||||||
|
renderer->device,
|
||||||
|
"Failed to map transfer buffer for write!",
|
||||||
|
res
|
||||||
|
);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *bufferPointer =
|
uint8_t *bufferPointer =
|
||||||
buffer->data + copyParams->dstOffset;
|
(uint8_t*) mappedSubresource.pData + copyParams->dstOffset;
|
||||||
|
|
||||||
SDL_memcpy(
|
SDL_memcpy(
|
||||||
bufferPointer,
|
bufferPointer,
|
||||||
((uint8_t*) data) + copyParams->srcOffset,
|
((uint8_t*) data) + copyParams->srcOffset,
|
||||||
copyParams->size
|
copyParams->size
|
||||||
);
|
);
|
||||||
|
|
||||||
|
ID3D11DeviceContext_Unmap(
|
||||||
|
renderer->immediateContext,
|
||||||
|
buffer->buffer.handle,
|
||||||
|
0
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void D3D11_GetTransferData(
|
static void D3D11_GetTransferData(
|
||||||
|
@ -1925,17 +1978,44 @@ static void D3D11_GetTransferData(
|
||||||
void* data,
|
void* data,
|
||||||
Refresh_BufferCopy *copyParams
|
Refresh_BufferCopy *copyParams
|
||||||
) {
|
) {
|
||||||
|
D3D11Renderer *renderer = (D3D11Renderer*) driverData;
|
||||||
D3D11TransferBufferContainer *container = (D3D11TransferBufferContainer*) transferBuffer;
|
D3D11TransferBufferContainer *container = (D3D11TransferBufferContainer*) transferBuffer;
|
||||||
D3D11TransferBuffer *buffer = container->activeBuffer;
|
D3D11TransferBuffer *buffer = container->activeBuffer;
|
||||||
|
D3D11_MAPPED_SUBRESOURCE mappedSubresource;
|
||||||
|
HRESULT res;
|
||||||
|
|
||||||
|
res = ID3D11DeviceContext_Map(
|
||||||
|
renderer->immediateContext,
|
||||||
|
buffer->buffer.handle,
|
||||||
|
0,
|
||||||
|
D3D11_MAP_READ,
|
||||||
|
0,
|
||||||
|
&mappedSubresource
|
||||||
|
);
|
||||||
|
if (FAILED(res))
|
||||||
|
{
|
||||||
|
D3D11_INTERNAL_LogError(
|
||||||
|
renderer->device,
|
||||||
|
"Failed to map transfer buffer for read!",
|
||||||
|
res
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t *bufferPointer =
|
uint8_t *bufferPointer =
|
||||||
buffer->data + copyParams->srcOffset;
|
(uint8_t*) mappedSubresource.pData + copyParams->srcOffset;
|
||||||
|
|
||||||
SDL_memcpy(
|
SDL_memcpy(
|
||||||
((uint8_t*) data) + copyParams->dstOffset,
|
((uint8_t*) data) + copyParams->dstOffset,
|
||||||
bufferPointer,
|
bufferPointer,
|
||||||
copyParams->size
|
copyParams->size
|
||||||
);
|
);
|
||||||
|
|
||||||
|
ID3D11DeviceContext_Unmap(
|
||||||
|
renderer->immediateContext,
|
||||||
|
buffer->buffer.handle,
|
||||||
|
0
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy Pass */
|
/* Copy Pass */
|
||||||
|
@ -1955,10 +2035,13 @@ static void D3D11_UploadToTexture(
|
||||||
Refresh_BufferImageCopy *copyParams,
|
Refresh_BufferImageCopy *copyParams,
|
||||||
Refresh_WriteOptions writeOption
|
Refresh_WriteOptions writeOption
|
||||||
) {
|
) {
|
||||||
|
D3D11Renderer *renderer = (D3D11Renderer*) driverData;
|
||||||
D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer*) commandBuffer;
|
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;
|
||||||
|
D3D11_MAPPED_SUBRESOURCE mappedSubresource;
|
||||||
|
HRESULT res;
|
||||||
|
|
||||||
int32_t w = textureRegion->w;
|
int32_t w = textureRegion->w;
|
||||||
int32_t h = textureRegion->h;
|
int32_t h = textureRegion->h;
|
||||||
|
@ -1970,30 +2053,87 @@ static void D3D11_UploadToTexture(
|
||||||
h = (h + blockSize - 1) & ~(blockSize - 1);
|
h = (h + blockSize - 1) & ~(blockSize - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D11_BOX dstBox;
|
if (
|
||||||
dstBox.left = textureRegion->x;
|
(copyParams->bufferStride == 0 || copyParams->bufferStride == BytesPerRow(w, d3d11Texture->format)) &&
|
||||||
dstBox.top = textureRegion->y;
|
(copyParams->bufferImageHeight == 0 || copyParams->bufferImageHeight == h )
|
||||||
dstBox.front = textureRegion->d;
|
) {
|
||||||
dstBox.right = textureRegion->x + w;
|
/* Fast path */
|
||||||
dstBox.bottom = textureRegion->y + h;
|
D3D11_BOX srcBox;
|
||||||
dstBox.back = textureRegion->d + 1;
|
srcBox.left = copyParams->bufferOffset;
|
||||||
|
srcBox.top = 0;
|
||||||
|
srcBox.front = 0;
|
||||||
|
srcBox.right = copyParams->bufferOffset + BytesPerImage(w, h, d3d11Texture->format);
|
||||||
|
srcBox.bottom = 1;
|
||||||
|
srcBox.back = 1;
|
||||||
|
|
||||||
ID3D11DeviceContext1_UpdateSubresource1(
|
ID3D11DeviceContext1_CopySubresourceRegion1(
|
||||||
d3d11CommandBuffer->context,
|
d3d11CommandBuffer->context,
|
||||||
d3d11Texture->handle,
|
d3d11Texture->handle,
|
||||||
D3D11_INTERNAL_CalcSubresource(
|
D3D11_INTERNAL_CalcSubresource(
|
||||||
textureRegion->textureSlice.mipLevel,
|
textureRegion->textureSlice.mipLevel,
|
||||||
textureRegion->textureSlice.layer,
|
textureRegion->textureSlice.layer,
|
||||||
1
|
1
|
||||||
),
|
),
|
||||||
&dstBox,
|
textureRegion->x,
|
||||||
d3d11TransferBuffer->data + copyParams->bufferOffset,
|
textureRegion->y,
|
||||||
copyParams->bufferStride,
|
textureRegion->z,
|
||||||
copyParams->bufferStride * copyParams->bufferImageHeight,
|
d3d11TransferBuffer->buffer.handle,
|
||||||
writeOption == REFRESH_WRITEOPTIONS_SAFEDISCARD ? D3D11_COPY_DISCARD : 0
|
0,
|
||||||
);
|
&srcBox,
|
||||||
|
writeOption == REFRESH_WRITEOPTIONS_SAFEDISCARD ? D3D11_COPY_DISCARD : 0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
D3D11_BOX dstBox;
|
||||||
|
dstBox.left = textureRegion->x;
|
||||||
|
dstBox.top = textureRegion->y;
|
||||||
|
dstBox.front = textureRegion->d;
|
||||||
|
dstBox.right = textureRegion->x + w;
|
||||||
|
dstBox.bottom = textureRegion->y + h;
|
||||||
|
dstBox.back = textureRegion->d + 1;
|
||||||
|
|
||||||
D3D11_INTERNAL_TrackTransferBuffer(commandBuffer, d3d11TransferBuffer);
|
res = ID3D11DeviceContext1_Map(
|
||||||
|
d3d11CommandBuffer->context,
|
||||||
|
d3d11TransferBuffer->buffer.handle,
|
||||||
|
0,
|
||||||
|
D3D11_MAP_READ,
|
||||||
|
D3D11_MAP_FLAG_DO_NOT_WAIT,
|
||||||
|
&mappedSubresource
|
||||||
|
);
|
||||||
|
if (FAILED(res))
|
||||||
|
{
|
||||||
|
D3D11_INTERNAL_LogError(
|
||||||
|
renderer->device,
|
||||||
|
"Failed to map transfer buffer for read!",
|
||||||
|
res
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ID3D11DeviceContext1_UpdateSubresource1(
|
||||||
|
d3d11CommandBuffer->context,
|
||||||
|
d3d11Texture->handle,
|
||||||
|
D3D11_INTERNAL_CalcSubresource(
|
||||||
|
textureRegion->textureSlice.mipLevel,
|
||||||
|
textureRegion->textureSlice.layer,
|
||||||
|
1
|
||||||
|
),
|
||||||
|
&dstBox,
|
||||||
|
(uint8_t*) mappedSubresource.pData + copyParams->bufferOffset,
|
||||||
|
copyParams->bufferStride,
|
||||||
|
copyParams->bufferStride * copyParams->bufferImageHeight,
|
||||||
|
writeOption == REFRESH_WRITEOPTIONS_SAFEDISCARD ? D3D11_COPY_DISCARD : 0
|
||||||
|
);
|
||||||
|
|
||||||
|
ID3D11DeviceContext1_Unmap(
|
||||||
|
renderer->immediateContext,
|
||||||
|
d3d11TransferBuffer->buffer.handle,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D11_INTERNAL_TrackTransferBuffer(d3d11CommandBuffer, d3d11TransferBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void D3D11_UploadToBuffer(
|
static void D3D11_UploadToBuffer(
|
||||||
|
@ -2008,20 +2148,78 @@ static void D3D11_UploadToBuffer(
|
||||||
D3D11TransferBufferContainer *container = (D3D11TransferBufferContainer*) transferBuffer;
|
D3D11TransferBufferContainer *container = (D3D11TransferBufferContainer*) transferBuffer;
|
||||||
D3D11TransferBuffer *d3d11TransferBuffer = container->activeBuffer;
|
D3D11TransferBuffer *d3d11TransferBuffer = container->activeBuffer;
|
||||||
D3D11Buffer *d3d11Buffer = (D3D11Buffer*) gpuBuffer;
|
D3D11Buffer *d3d11Buffer = (D3D11Buffer*) gpuBuffer;
|
||||||
D3D11_BOX dstBox = { copyParams->dstOffset, 0, 0, copyParams->dstOffset + copyParams->size, 1, 1 };
|
D3D11_BOX srcBox = { copyParams->srcOffset, 0, 0, copyParams->srcOffset + copyParams->size, 1, 1 };
|
||||||
|
|
||||||
ID3D11DeviceContext1_UpdateSubresource1(
|
ID3D11DeviceContext1_CopySubresourceRegion1(
|
||||||
d3d11CommandBuffer->context,
|
d3d11CommandBuffer->context,
|
||||||
(ID3D11Resource*) d3d11Buffer->handle,
|
d3d11Buffer->handle,
|
||||||
0,
|
0,
|
||||||
&dstBox,
|
copyParams->dstOffset,
|
||||||
d3d11TransferBuffer->data + copyParams->dstOffset,
|
0,
|
||||||
copyParams->size,
|
0,
|
||||||
1,
|
d3d11TransferBuffer->buffer.handle,
|
||||||
|
0,
|
||||||
|
&srcBox,
|
||||||
writeOption == REFRESH_WRITEOPTIONS_SAFEDISCARD ? D3D11_COPY_DISCARD : 0
|
writeOption == REFRESH_WRITEOPTIONS_SAFEDISCARD ? D3D11_COPY_DISCARD : 0
|
||||||
);
|
);
|
||||||
|
|
||||||
D3D11_INTERNAL_TrackTransferBuffer(commandBuffer, d3d11TransferBuffer);
|
D3D11_INTERNAL_TrackTransferBuffer(d3d11CommandBuffer, d3d11TransferBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void D3D11_DownloadFromTexture(
|
||||||
|
Refresh_Renderer *driverData,
|
||||||
|
Refresh_CommandBuffer *commandBuffer,
|
||||||
|
Refresh_TextureRegion *textureRegion,
|
||||||
|
Refresh_TransferBuffer *transferBuffer,
|
||||||
|
Refresh_BufferImageCopy *copyParams,
|
||||||
|
Refresh_TransferOptions transferOption
|
||||||
|
) {
|
||||||
|
D3D11Renderer *renderer = (D3D11Renderer*) driverData;
|
||||||
|
D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer*) commandBuffer;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void D3D11_DownloadFromBuffer(
|
||||||
|
Refresh_Renderer *driverData,
|
||||||
|
Refresh_CommandBuffer *commandBuffer,
|
||||||
|
Refresh_GpuBuffer *gpuBuffer,
|
||||||
|
Refresh_TransferBuffer *transferBuffer,
|
||||||
|
Refresh_BufferCopy *copyParams,
|
||||||
|
Refresh_TransferOptions transferOption
|
||||||
|
) {
|
||||||
|
D3D11Renderer *renderer = (D3D11Renderer*) driverData;
|
||||||
|
D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer*) commandBuffer;
|
||||||
|
D3D11TransferBufferContainer *container = (D3D11TransferBufferContainer*) transferBuffer;
|
||||||
|
D3D11TransferBuffer *d3d11TransferBuffer = container->activeBuffer;
|
||||||
|
D3D11Buffer *d3d11Buffer = (D3D11Buffer*) gpuBuffer;
|
||||||
|
D3D11_BOX srcBox = { copyParams->srcOffset, 0, 0, copyParams->srcOffset + copyParams->size, 1, 1 };
|
||||||
|
|
||||||
|
/* Rotate the transfer buffer if necessary */
|
||||||
|
if (
|
||||||
|
transferOption == REFRESH_TRANSFEROPTIONS_SAFEDISCARD &&
|
||||||
|
SDL_AtomicGet(&container->activeBuffer->referenceCount) > 0
|
||||||
|
) {
|
||||||
|
D3D11_INTERNAL_DiscardActiveTransferBuffer(
|
||||||
|
renderer,
|
||||||
|
container
|
||||||
|
);
|
||||||
|
d3d11TransferBuffer = container->activeBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
ID3D11DeviceContext1_CopySubresourceRegion1(
|
||||||
|
d3d11CommandBuffer->context,
|
||||||
|
d3d11TransferBuffer->buffer.handle,
|
||||||
|
0,
|
||||||
|
copyParams->dstOffset,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
d3d11Buffer->handle,
|
||||||
|
0,
|
||||||
|
&srcBox,
|
||||||
|
D3D11_COPY_NO_OVERWRITE
|
||||||
|
);
|
||||||
|
|
||||||
|
D3D11_INTERNAL_TrackTransferBuffer(d3d11CommandBuffer, d3d11TransferBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void D3D11_CopyTextureToTexture(
|
static void D3D11_CopyTextureToTexture(
|
||||||
|
|
Loading…
Reference in New Issue