mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-06-02 07:27:19 +08:00
GPU: Defer setting blend state on D3D11
This commit is contained in:
@@ -492,6 +492,7 @@ typedef struct D3D11GraphicsPipeline
|
|||||||
Sint32 numColorTargets;
|
Sint32 numColorTargets;
|
||||||
DXGI_FORMAT colorTargetFormats[MAX_COLOR_TARGET_BINDINGS];
|
DXGI_FORMAT colorTargetFormats[MAX_COLOR_TARGET_BINDINGS];
|
||||||
ID3D11BlendState *colorTargetBlendState;
|
ID3D11BlendState *colorTargetBlendState;
|
||||||
|
Uint32 sampleMask;
|
||||||
|
|
||||||
SDL_GPUMultisampleState multisampleState;
|
SDL_GPUMultisampleState multisampleState;
|
||||||
|
|
||||||
@@ -666,6 +667,9 @@ typedef struct D3D11CommandBuffer
|
|||||||
bool needComputeReadOnlyBufferBind;
|
bool needComputeReadOnlyBufferBind;
|
||||||
bool needComputeUniformBufferBind;
|
bool needComputeUniformBufferBind;
|
||||||
|
|
||||||
|
// defer OMSetBlendState because it combines three different states
|
||||||
|
bool needBlendStateSet;
|
||||||
|
|
||||||
ID3D11Buffer *vertexBuffers[MAX_BUFFER_BINDINGS];
|
ID3D11Buffer *vertexBuffers[MAX_BUFFER_BINDINGS];
|
||||||
Uint32 vertexBufferOffsets[MAX_BUFFER_BINDINGS];
|
Uint32 vertexBufferOffsets[MAX_BUFFER_BINDINGS];
|
||||||
Uint32 vertexBufferCount;
|
Uint32 vertexBufferCount;
|
||||||
@@ -1567,6 +1571,9 @@ static SDL_GPUGraphicsPipeline *D3D11_CreateGraphicsPipeline(
|
|||||||
// Multisample
|
// Multisample
|
||||||
|
|
||||||
pipeline->multisampleState = createinfo->multisample_state;
|
pipeline->multisampleState = createinfo->multisample_state;
|
||||||
|
pipeline->sampleMask = createinfo->multisample_state.enable_mask ?
|
||||||
|
createinfo->multisample_state.sample_mask :
|
||||||
|
0xFFFFFFFF;
|
||||||
|
|
||||||
// Depth-Stencil
|
// Depth-Stencil
|
||||||
|
|
||||||
@@ -3249,6 +3256,7 @@ static SDL_GPUCommandBuffer *D3D11_AcquireCommandBuffer(
|
|||||||
commandBuffer->needFragmentStorageBufferBind = true;
|
commandBuffer->needFragmentStorageBufferBind = true;
|
||||||
commandBuffer->needFragmentUniformBufferBind = true;
|
commandBuffer->needFragmentUniformBufferBind = true;
|
||||||
commandBuffer->needComputeUniformBufferBind = true;
|
commandBuffer->needComputeUniformBufferBind = true;
|
||||||
|
commandBuffer->needBlendStateSet = true;
|
||||||
|
|
||||||
SDL_zeroa(commandBuffer->vertexSamplers);
|
SDL_zeroa(commandBuffer->vertexSamplers);
|
||||||
SDL_zeroa(commandBuffer->vertexSamplerTextures);
|
SDL_zeroa(commandBuffer->vertexSamplerTextures);
|
||||||
@@ -3459,19 +3467,8 @@ static void D3D11_SetBlendConstants(
|
|||||||
SDL_FColor blendConstants)
|
SDL_FColor blendConstants)
|
||||||
{
|
{
|
||||||
D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer *)commandBuffer;
|
D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer *)commandBuffer;
|
||||||
FLOAT blendFactor[4] = { blendConstants.r, blendConstants.g, blendConstants.b, blendConstants.a };
|
|
||||||
Uint32 sample_mask = d3d11CommandBuffer->graphicsPipeline->multisampleState.enable_mask ?
|
|
||||||
d3d11CommandBuffer->graphicsPipeline->multisampleState.sample_mask :
|
|
||||||
0xFFFFFFFF;
|
|
||||||
d3d11CommandBuffer->blendConstants = blendConstants;
|
d3d11CommandBuffer->blendConstants = blendConstants;
|
||||||
|
d3d11CommandBuffer->needBlendStateSet = true;
|
||||||
if (d3d11CommandBuffer->graphicsPipeline != NULL) {
|
|
||||||
ID3D11DeviceContext_OMSetBlendState(
|
|
||||||
d3d11CommandBuffer->context,
|
|
||||||
d3d11CommandBuffer->graphicsPipeline->colorTargetBlendState,
|
|
||||||
blendFactor,
|
|
||||||
sample_mask);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void D3D11_SetStencilReference(
|
static void D3D11_SetStencilReference(
|
||||||
@@ -3667,23 +3664,8 @@ static void D3D11_BindGraphicsPipeline(
|
|||||||
{
|
{
|
||||||
D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer *)commandBuffer;
|
D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer *)commandBuffer;
|
||||||
D3D11GraphicsPipeline *pipeline = (D3D11GraphicsPipeline *)graphicsPipeline;
|
D3D11GraphicsPipeline *pipeline = (D3D11GraphicsPipeline *)graphicsPipeline;
|
||||||
FLOAT blendFactor[4] = {
|
|
||||||
d3d11CommandBuffer->blendConstants.r,
|
|
||||||
d3d11CommandBuffer->blendConstants.g,
|
|
||||||
d3d11CommandBuffer->blendConstants.b,
|
|
||||||
d3d11CommandBuffer->blendConstants.a
|
|
||||||
};
|
|
||||||
Uint32 sample_mask = pipeline->multisampleState.enable_mask ?
|
|
||||||
pipeline->multisampleState.sample_mask :
|
|
||||||
0xFFFFFFFF;
|
|
||||||
d3d11CommandBuffer->graphicsPipeline = pipeline;
|
d3d11CommandBuffer->graphicsPipeline = pipeline;
|
||||||
|
|
||||||
ID3D11DeviceContext_OMSetBlendState(
|
|
||||||
d3d11CommandBuffer->context,
|
|
||||||
pipeline->colorTargetBlendState,
|
|
||||||
blendFactor,
|
|
||||||
sample_mask);
|
|
||||||
|
|
||||||
ID3D11DeviceContext_OMSetDepthStencilState(
|
ID3D11DeviceContext_OMSetDepthStencilState(
|
||||||
d3d11CommandBuffer->context,
|
d3d11CommandBuffer->context,
|
||||||
pipeline->depthStencilState,
|
pipeline->depthStencilState,
|
||||||
@@ -3737,6 +3719,7 @@ static void D3D11_BindGraphicsPipeline(
|
|||||||
d3d11CommandBuffer->needFragmentStorageTextureBind = true;
|
d3d11CommandBuffer->needFragmentStorageTextureBind = true;
|
||||||
d3d11CommandBuffer->needFragmentStorageBufferBind = true;
|
d3d11CommandBuffer->needFragmentStorageBufferBind = true;
|
||||||
d3d11CommandBuffer->needFragmentUniformBufferBind = true;
|
d3d11CommandBuffer->needFragmentUniformBufferBind = true;
|
||||||
|
d3d11CommandBuffer->needBlendStateSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void D3D11_BindVertexBuffers(
|
static void D3D11_BindVertexBuffers(
|
||||||
@@ -4112,6 +4095,23 @@ static void D3D11_INTERNAL_BindGraphicsResources(
|
|||||||
|
|
||||||
commandBuffer->needFragmentUniformBufferBind = false;
|
commandBuffer->needFragmentUniformBufferBind = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (commandBuffer->needBlendStateSet) {
|
||||||
|
FLOAT blendFactor[4] = {
|
||||||
|
commandBuffer->blendConstants.r,
|
||||||
|
commandBuffer->blendConstants.g,
|
||||||
|
commandBuffer->blendConstants.b,
|
||||||
|
commandBuffer->blendConstants.a
|
||||||
|
};
|
||||||
|
|
||||||
|
ID3D11DeviceContext_OMSetBlendState(
|
||||||
|
commandBuffer->context,
|
||||||
|
graphicsPipeline->colorTargetBlendState,
|
||||||
|
blendFactor,
|
||||||
|
graphicsPipeline->sampleMask);
|
||||||
|
|
||||||
|
commandBuffer->needBlendStateSet = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void D3D11_DrawIndexedPrimitives(
|
static void D3D11_DrawIndexedPrimitives(
|
||||||
|
|||||||
Reference in New Issue
Block a user