gpu: Warn about Direct3D 12 texture alignment requirements.
Fixes #12835.
This commit is contained in:
parent
2e45198299
commit
faa2e40406
2 changed files with 16 additions and 1 deletions
|
@ -1347,6 +1347,12 @@ typedef struct SDL_GPUViewport
|
||||||
* SDL_DownloadFromGPUTexture are used as default values respectively and data
|
* SDL_DownloadFromGPUTexture are used as default values respectively and data
|
||||||
* is considered to be tightly packed.
|
* is considered to be tightly packed.
|
||||||
*
|
*
|
||||||
|
* **WARNING**: Direct3D 12 requires texture data row pitch to be 256 byte
|
||||||
|
* aligned, and offsets to be aligned to 512 bytes. If they are not, SDL will
|
||||||
|
* make a temporary copy of the data that is properly aligned, but this adds
|
||||||
|
* overhead to the transfer process. Apps can avoid this by aligning their
|
||||||
|
* data appropriately, or using a different GPU backend than Direct3D 12.
|
||||||
|
*
|
||||||
* \since This struct is available since SDL 3.2.0.
|
* \since This struct is available since SDL 3.2.0.
|
||||||
*
|
*
|
||||||
* \sa SDL_UploadToGPUTexture
|
* \sa SDL_UploadToGPUTexture
|
||||||
|
|
|
@ -5934,6 +5934,10 @@ static void D3D12_UploadToTexture(
|
||||||
D3D12_INTERNAL_ReleaseBuffer(
|
D3D12_INTERNAL_ReleaseBuffer(
|
||||||
d3d12CommandBuffer->renderer,
|
d3d12CommandBuffer->renderer,
|
||||||
temporaryBuffer);
|
temporaryBuffer);
|
||||||
|
|
||||||
|
if (d3d12CommandBuffer->renderer->debug_mode) {
|
||||||
|
SDL_LogWarn(SDL_LOG_CATEGORY_GPU, "Texture upload row pitch not aligned to 256 bytes! This is suboptimal on D3D12!");
|
||||||
|
}
|
||||||
} else if (needsPlacementCopy) {
|
} else if (needsPlacementCopy) {
|
||||||
temporaryBuffer = D3D12_INTERNAL_CreateBuffer(
|
temporaryBuffer = D3D12_INTERNAL_CreateBuffer(
|
||||||
d3d12CommandBuffer->renderer,
|
d3d12CommandBuffer->renderer,
|
||||||
|
@ -5971,7 +5975,9 @@ static void D3D12_UploadToTexture(
|
||||||
d3d12CommandBuffer->renderer,
|
d3d12CommandBuffer->renderer,
|
||||||
temporaryBuffer);
|
temporaryBuffer);
|
||||||
|
|
||||||
SDL_LogWarn(SDL_LOG_CATEGORY_GPU, "Texture upload offset not aligned to 512 bytes! This is suboptimal on D3D12!");
|
if (d3d12CommandBuffer->renderer->debug_mode) {
|
||||||
|
SDL_LogWarn(SDL_LOG_CATEGORY_GPU, "Texture upload offset not aligned to 512 bytes! This is suboptimal on D3D12!");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
sourceLocation.pResource = transferBufferContainer->activeBuffer->handle;
|
sourceLocation.pResource = transferBufferContainer->activeBuffer->handle;
|
||||||
sourceLocation.PlacedFootprint.Offset = source->offset;
|
sourceLocation.PlacedFootprint.Offset = source->offset;
|
||||||
|
@ -6242,6 +6248,9 @@ static void D3D12_DownloadFromTexture(
|
||||||
|
|
||||||
destinationLocation.pResource = textureDownload->temporaryBuffer->handle;
|
destinationLocation.pResource = textureDownload->temporaryBuffer->handle;
|
||||||
destinationLocation.PlacedFootprint.Offset = 0;
|
destinationLocation.PlacedFootprint.Offset = 0;
|
||||||
|
if (d3d12CommandBuffer->renderer->debug_mode) {
|
||||||
|
SDL_LogWarn(SDL_LOG_CATEGORY_GPU, "Texture pitch or offset not aligned properly! This is suboptimal on D3D12!");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
destinationLocation.pResource = destinationBuffer->handle;
|
destinationLocation.pResource = destinationBuffer->handle;
|
||||||
destinationLocation.PlacedFootprint.Offset = destination->offset;
|
destinationLocation.PlacedFootprint.Offset = destination->offset;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue