d3d11 swapchain texture handle + misc fixes
continuous-integration/drone/push Build is failing
Details
continuous-integration/drone/push Build is failing
Details
parent
65c30350a7
commit
953be4225c
|
@ -1,4 +1,4 @@
|
||||||
/* Refresh - XNA-inspired 3D Graphics Library with modern capabilities
|
/* Refresh - XNA-inspired 3D Graphics Library with modern capabilities
|
||||||
*
|
*
|
||||||
* Copyright (c) 2020 Evan Hemsley
|
* Copyright (c) 2020 Evan Hemsley
|
||||||
*
|
*
|
||||||
|
@ -2130,7 +2130,7 @@ static void D3D11_DownloadFromTexture(
|
||||||
renderer->immediateContext,
|
renderer->immediateContext,
|
||||||
stagingTexture,
|
stagingTexture,
|
||||||
0,
|
0,
|
||||||
0,
|
copyParams->bufferOffset,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
d3d11Texture->handle,
|
d3d11Texture->handle,
|
||||||
|
@ -2159,14 +2159,27 @@ static void D3D11_DownloadFromTexture(
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t* dataPtr = (uint8_t*) d3d11TransferBuffer->data + copyParams->bufferOffset;
|
uint8_t* dataPtr = (uint8_t*) d3d11TransferBuffer->data + copyParams->bufferOffset;
|
||||||
for (uint32_t row = textureRegion->y; row < copyParams->bufferImageHeight; row += 1)
|
|
||||||
|
if (bufferStride == 0 && bufferImageHeight == 0) // assume tightly packed
|
||||||
{
|
{
|
||||||
SDL_memcpy(
|
SDL_memcpy(
|
||||||
dataPtr,
|
dataPtr,
|
||||||
(uint8_t*) subresource.pData + (row * bufferStride) + (textureRegion->x * formatSize),
|
(uint8_t *)subresource.pData,
|
||||||
textureRegion->w * formatSize
|
BytesPerImage(textureRegion->w, textureRegion->h, d3d11Texture->format)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ID3D11DeviceContext1_Unmap(
|
ID3D11DeviceContext1_Unmap(
|
||||||
renderer->immediateContext,
|
renderer->immediateContext,
|
||||||
|
@ -2295,7 +2308,7 @@ static void D3D11_CopyTextureToTexture(
|
||||||
destination->textureSlice.layer,
|
destination->textureSlice.layer,
|
||||||
dstTexture->levelCount
|
dstTexture->levelCount
|
||||||
);
|
);
|
||||||
D3D11_BOX srcBox = { source->x, source->y, source->z, source->x + source->w, source->y + source->w, 1 };
|
D3D11_BOX srcBox = { source->x, source->y, source->z, source->x + source->w, source->y + source->h, 1 };
|
||||||
|
|
||||||
ID3D11DeviceContext1_CopySubresourceRegion1(
|
ID3D11DeviceContext1_CopySubresourceRegion1(
|
||||||
d3d11CommandBuffer->context,
|
d3d11CommandBuffer->context,
|
||||||
|
@ -3457,9 +3470,11 @@ static uint8_t D3D11_INTERNAL_InitializeSwapchainTexture(
|
||||||
D3D11Texture *pTexture
|
D3D11Texture *pTexture
|
||||||
) {
|
) {
|
||||||
ID3D11Texture2D *swapchainTexture;
|
ID3D11Texture2D *swapchainTexture;
|
||||||
|
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
|
||||||
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
|
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
|
||||||
D3D11_UNORDERED_ACCESS_VIEW_DESC uavDesc;
|
D3D11_UNORDERED_ACCESS_VIEW_DESC uavDesc;
|
||||||
D3D11_TEXTURE2D_DESC textureDesc;
|
D3D11_TEXTURE2D_DESC textureDesc;
|
||||||
|
ID3D11ShaderResourceView *srv;
|
||||||
ID3D11RenderTargetView *rtv;
|
ID3D11RenderTargetView *rtv;
|
||||||
ID3D11UnorderedAccessView *uav;
|
ID3D11UnorderedAccessView *uav;
|
||||||
HRESULT res;
|
HRESULT res;
|
||||||
|
@ -3476,6 +3491,25 @@ static uint8_t D3D11_INTERNAL_InitializeSwapchainTexture(
|
||||||
);
|
);
|
||||||
ERROR_CHECK_RETURN("Could not get buffer from swapchain!", 0);
|
ERROR_CHECK_RETURN("Could not get buffer from swapchain!", 0);
|
||||||
|
|
||||||
|
/* Create the SRV for the swapchain */
|
||||||
|
srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
|
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
|
||||||
|
srvDesc.Texture2D.MipLevels = 1;
|
||||||
|
srvDesc.Texture2D.MostDetailedMip = 0;
|
||||||
|
|
||||||
|
res = ID3D11Device_CreateShaderResourceView(
|
||||||
|
renderer->device,
|
||||||
|
(ID3D11Resource *)swapchainTexture,
|
||||||
|
&srvDesc,
|
||||||
|
&srv
|
||||||
|
);
|
||||||
|
if (FAILED(res))
|
||||||
|
{
|
||||||
|
ID3D11Texture2D_Release(swapchainTexture);
|
||||||
|
D3D11_INTERNAL_LogError(renderer->device, "Swapchain SRV creation failed", res);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Create the RTV for the swapchain */
|
/* Create the RTV for the swapchain */
|
||||||
rtvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
rtvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
|
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
|
||||||
|
@ -3489,6 +3523,7 @@ static uint8_t D3D11_INTERNAL_InitializeSwapchainTexture(
|
||||||
);
|
);
|
||||||
if (FAILED(res))
|
if (FAILED(res))
|
||||||
{
|
{
|
||||||
|
ID3D11ShaderResourceView_Release(srv);
|
||||||
ID3D11Texture2D_Release(swapchainTexture);
|
ID3D11Texture2D_Release(swapchainTexture);
|
||||||
D3D11_INTERNAL_LogError(renderer->device, "Swapchain RTV creation failed", res);
|
D3D11_INTERNAL_LogError(renderer->device, "Swapchain RTV creation failed", res);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -3506,6 +3541,7 @@ static uint8_t D3D11_INTERNAL_InitializeSwapchainTexture(
|
||||||
);
|
);
|
||||||
if (FAILED(res))
|
if (FAILED(res))
|
||||||
{
|
{
|
||||||
|
ID3D11ShaderResourceView_Release(srv);
|
||||||
ID3D11RenderTargetView_Release(rtv);
|
ID3D11RenderTargetView_Release(rtv);
|
||||||
ID3D11Texture2D_Release(swapchainTexture);
|
ID3D11Texture2D_Release(swapchainTexture);
|
||||||
D3D11_INTERNAL_LogError(renderer->device, "Swapchain UAV creation failed", res);
|
D3D11_INTERNAL_LogError(renderer->device, "Swapchain UAV creation failed", res);
|
||||||
|
@ -3513,8 +3549,8 @@ static uint8_t D3D11_INTERNAL_InitializeSwapchainTexture(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fill out the texture struct */
|
/* Fill out the texture struct */
|
||||||
pTexture->handle = NULL; /* The texture does not "own" the swapchain texture, and it can change dynamically. */
|
pTexture->handle = NULL; /* This will be set in AcquireSwapchainTexture. */
|
||||||
pTexture->shaderView = NULL;
|
pTexture->shaderView = srv;
|
||||||
pTexture->subresources = SDL_malloc(sizeof(D3D11TextureSubresource));
|
pTexture->subresources = SDL_malloc(sizeof(D3D11TextureSubresource));
|
||||||
pTexture->subresources[0].colorTargetView = rtv;
|
pTexture->subresources[0].colorTargetView = rtv;
|
||||||
pTexture->subresources[0].uav = uav;
|
pTexture->subresources[0].uav = uav;
|
||||||
|
@ -3571,7 +3607,7 @@ static uint8_t D3D11_INTERNAL_CreateSwapchain(
|
||||||
/* Initialize the rest of the swapchain descriptor */
|
/* Initialize the rest of the swapchain descriptor */
|
||||||
swapchainDesc.SampleDesc.Count = 1;
|
swapchainDesc.SampleDesc.Count = 1;
|
||||||
swapchainDesc.SampleDesc.Quality = 0;
|
swapchainDesc.SampleDesc.Quality = 0;
|
||||||
swapchainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_UNORDERED_ACCESS;
|
swapchainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_UNORDERED_ACCESS | DXGI_USAGE_SHADER_INPUT;
|
||||||
swapchainDesc.BufferCount = 2;
|
swapchainDesc.BufferCount = 2;
|
||||||
swapchainDesc.OutputWindow = dxgiHandle;
|
swapchainDesc.OutputWindow = dxgiHandle;
|
||||||
swapchainDesc.Windowed = 1;
|
swapchainDesc.Windowed = 1;
|
||||||
|
@ -3748,6 +3784,7 @@ static void D3D11_UnclaimWindow(
|
||||||
|
|
||||||
D3D11_Wait(driverData);
|
D3D11_Wait(driverData);
|
||||||
|
|
||||||
|
ID3D11ShaderResourceView_Release(windowData->texture.shaderView);
|
||||||
ID3D11RenderTargetView_Release(windowData->texture.subresources[0].colorTargetView);
|
ID3D11RenderTargetView_Release(windowData->texture.subresources[0].colorTargetView);
|
||||||
ID3D11UnorderedAccessView_Release(windowData->texture.subresources[0].uav);
|
ID3D11UnorderedAccessView_Release(windowData->texture.subresources[0].uav);
|
||||||
SDL_free(windowData->texture.subresources);
|
SDL_free(windowData->texture.subresources);
|
||||||
|
@ -3804,6 +3841,15 @@ static Refresh_Texture* D3D11_AcquireSwapchainTexture(
|
||||||
ERROR_CHECK_RETURN("Could not resize swapchain", NULL);
|
ERROR_CHECK_RETURN("Could not resize swapchain", NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set the handle on the windowData texture data. */
|
||||||
|
res = IDXGISwapChain_GetBuffer(
|
||||||
|
windowData->swapchain,
|
||||||
|
0,
|
||||||
|
&D3D_IID_ID3D11Texture2D,
|
||||||
|
(void**) &windowData->texture.handle
|
||||||
|
);
|
||||||
|
ERROR_CHECK_RETURN("Could not acquire swapchain!", NULL);
|
||||||
|
|
||||||
/* Let the command buffer know it's associated with this swapchain. */
|
/* Let the command buffer know it's associated with this swapchain. */
|
||||||
d3d11CommandBuffer->windowData = windowData;
|
d3d11CommandBuffer->windowData = windowData;
|
||||||
|
|
||||||
|
@ -4011,6 +4057,8 @@ static void D3D11_Submit(
|
||||||
syncInterval,
|
syncInterval,
|
||||||
presentFlags
|
presentFlags
|
||||||
);
|
);
|
||||||
|
|
||||||
|
ID3D11Texture2D_Release(d3d11CommandBuffer->windowData->texture.handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if we can perform any cleanups */
|
/* Check if we can perform any cleanups */
|
||||||
|
|
Loading…
Reference in New Issue