Removed D3D11_Clear, added pWidth/pHeight to AcquireSwapchainImage, fixed(?) threading crash with swapchain Present

d3d11
Caleb Cornett 2022-03-11 18:17:35 -05:00
parent 5315e1c435
commit 107c94b6e9
1 changed files with 14 additions and 65 deletions

View File

@ -310,7 +310,7 @@ typedef struct D3D11Renderer
IDXGIAdapter1* adapter; IDXGIAdapter1* adapter;
void *d3d11_dll; void *d3d11_dll;
void *dxgi_dll; void *dxgi_dll;
SDL_mutex *immediateContextMutex; SDL_mutex *contextLock;
D3D11CommandBufferPool *commandBufferPool; D3D11CommandBufferPool *commandBufferPool;
SDL_mutex *commandBufferAcquisitionMutex; SDL_mutex *commandBufferAcquisitionMutex;
@ -629,65 +629,6 @@ static void D3D11_DestroyDevice(
/* Drawing */ /* Drawing */
static void D3D11_Clear(
Refresh_Renderer* driverData,
Refresh_CommandBuffer* commandBuffer,
Refresh_Rect* clearRect,
Refresh_ClearOptions options,
Refresh_Vec4* colors,
uint32_t colorCount,
Refresh_DepthStencilValue depthStencil
) {
D3D11Renderer *renderer = (D3D11Renderer*) driverData;
D3D11CommandBuffer *cmdbuf = (D3D11CommandBuffer*) commandBuffer;
D3D11_CLEAR_FLAG dsClearFlags;
float clearColors[4];
uint32_t i;
/* FIXME: What should we do about clearRect? */
/* FIXME: Do we need to use colorCount or is it always the number of bound RTs? */
if (options & REFRESH_CLEAROPTIONS_COLOR)
{
/* Clear color attachments */
for (i = 0; i < cmdbuf->numBoundColorAttachments; i += 1)
{
clearColors[0] = colors[i].x;
clearColors[1] = colors[i].y;
clearColors[2] = colors[i].z;
clearColors[3] = colors[i].w;
ID3D11DeviceContext_ClearRenderTargetView(
cmdbuf->context,
cmdbuf->rtViews[i],
clearColors
);
}
}
/* Check which of depth/stencil need to be cleared (if either) */
dsClearFlags = 0;
if (options & REFRESH_CLEAROPTIONS_DEPTH)
{
dsClearFlags |= D3D11_CLEAR_DEPTH;
}
if (options & REFRESH_CLEAROPTIONS_STENCIL)
{
dsClearFlags |= D3D11_CLEAR_STENCIL;
}
if (dsClearFlags != 0)
{
ID3D11DeviceContext_ClearDepthStencilView(
cmdbuf->context,
cmdbuf->dsView,
dsClearFlags,
depthStencil.depth,
(uint8_t) depthStencil.stencil
);
}
}
static void D3D11_DrawInstancedPrimitives( static void D3D11_DrawInstancedPrimitives(
Refresh_Renderer* driverData, Refresh_Renderer* driverData,
Refresh_CommandBuffer* commandBuffer, Refresh_CommandBuffer* commandBuffer,
@ -1202,10 +1143,12 @@ static D3D11SwapchainData* D3D11_INTERNAL_FetchSwapchainData(
return swapchainData; return swapchainData;
} }
Refresh_Texture* D3D11_AcquireSwapchainTexture( static Refresh_Texture* D3D11_AcquireSwapchainTexture(
Refresh_Renderer *driverData, Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer, Refresh_CommandBuffer *commandBuffer,
void *windowHandle void *windowHandle,
uint32_t *pWidth,
uint32_t *pHeight
) { ) {
D3D11Renderer *renderer = (D3D11Renderer*) driverData; D3D11Renderer *renderer = (D3D11Renderer*) driverData;
D3D11CommandBuffer *cmdbuf = (D3D11CommandBuffer*) commandBuffer; D3D11CommandBuffer *cmdbuf = (D3D11CommandBuffer*) commandBuffer;
@ -1241,6 +1184,10 @@ Refresh_Texture* D3D11_AcquireSwapchainTexture(
/* Let the command buffer know it's associated with this swapchain. */ /* Let the command buffer know it's associated with this swapchain. */
cmdbuf->swapchainData = swapchainData; cmdbuf->swapchainData = swapchainData;
/* Send the dimensions to the out parameters. */
*pWidth = swapchainData->refreshTexture.twod.width;
*pHeight = swapchainData->refreshTexture.twod.height;
/* Return the swapchain texture */ /* Return the swapchain texture */
return (Refresh_Texture*) &swapchainData->refreshTexture; return (Refresh_Texture*) &swapchainData->refreshTexture;
} }
@ -1285,13 +1232,13 @@ static void D3D11_Submit(
} }
/* Submit the command list to the immediate context */ /* Submit the command list to the immediate context */
SDL_LockMutex(renderer->immediateContextMutex); SDL_LockMutex(renderer->contextLock);
ID3D11DeviceContext_ExecuteCommandList( ID3D11DeviceContext_ExecuteCommandList(
renderer->immediateContext, renderer->immediateContext,
commandList, commandList,
0 0
); );
SDL_UnlockMutex(renderer->immediateContextMutex); SDL_UnlockMutex(renderer->contextLock);
/* Now that we're done, either save the command list or release it. */ /* Now that we're done, either save the command list or release it. */
if (commandBuffer->fixed) if (commandBuffer->fixed)
@ -1309,11 +1256,13 @@ static void D3D11_Submit(
/* Present, if applicable */ /* Present, if applicable */
if (commandBuffer->swapchainData) if (commandBuffer->swapchainData)
{ {
SDL_LockMutex(renderer->contextLock);
IDXGISwapChain_Present( IDXGISwapChain_Present(
commandBuffer->swapchainData->swapchain, commandBuffer->swapchainData->swapchain,
1, /* FIXME: Assumes vsync! */ 1, /* FIXME: Assumes vsync! */
0 0
); );
SDL_UnlockMutex(renderer->contextLock);
} }
} }
} }
@ -1458,7 +1407,7 @@ tryCreateDevice:
SDL_memset(renderer->commandBufferPool, 0, sizeof(D3D11CommandBufferPool)); SDL_memset(renderer->commandBufferPool, 0, sizeof(D3D11CommandBufferPool));
/* Create mutexes */ /* Create mutexes */
renderer->immediateContextMutex = SDL_CreateMutex(); renderer->contextLock = SDL_CreateMutex();
renderer->commandBufferAcquisitionMutex = SDL_CreateMutex(); renderer->commandBufferAcquisitionMutex = SDL_CreateMutex();
/* Initialize miscellaneous renderer members */ /* Initialize miscellaneous renderer members */