WinRT: D3D 11.1 blending mode support added; FillRects coloring bug-fix
This commit is contained in:
parent
a6c8d32843
commit
bafdb176fa
2 changed files with 90 additions and 5 deletions
|
@ -240,6 +240,37 @@ D3D11_LoadPixelShader(SDL_Renderer * renderer,
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT
|
||||||
|
D3D11_CreateBlendMode(SDL_Renderer * renderer,
|
||||||
|
BOOL enableBlending,
|
||||||
|
D3D11_BLEND srcBlend,
|
||||||
|
D3D11_BLEND destBlend,
|
||||||
|
ID3D11BlendState ** blendStateOutput)
|
||||||
|
{
|
||||||
|
D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata;
|
||||||
|
HRESULT result = S_OK;
|
||||||
|
|
||||||
|
D3D11_BLEND_DESC blendDesc;
|
||||||
|
memset(&blendDesc, 0, sizeof(blendDesc));
|
||||||
|
blendDesc.AlphaToCoverageEnable = FALSE;
|
||||||
|
blendDesc.IndependentBlendEnable = FALSE;
|
||||||
|
blendDesc.RenderTarget[0].BlendEnable = enableBlending;
|
||||||
|
blendDesc.RenderTarget[0].SrcBlend = srcBlend;
|
||||||
|
blendDesc.RenderTarget[0].DestBlend = destBlend;
|
||||||
|
blendDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
|
||||||
|
blendDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
|
||||||
|
blendDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
|
||||||
|
blendDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
|
||||||
|
blendDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
|
||||||
|
result = data->d3dDevice->CreateBlendState(&blendDesc, blendStateOutput);
|
||||||
|
if (FAILED(result)) {
|
||||||
|
WIN_SetErrorFromHRESULT(__FUNCTION__, result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
// Create resources that depend on the device.
|
// Create resources that depend on the device.
|
||||||
HRESULT
|
HRESULT
|
||||||
D3D11_CreateDeviceResources(SDL_Renderer * renderer)
|
D3D11_CreateDeviceResources(SDL_Renderer * renderer)
|
||||||
|
@ -428,6 +459,42 @@ D3D11_CreateDeviceResources(SDL_Renderer * renderer)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create blending states:
|
||||||
|
//
|
||||||
|
result = D3D11_CreateBlendMode(
|
||||||
|
renderer,
|
||||||
|
TRUE,
|
||||||
|
D3D11_BLEND_SRC_ALPHA,
|
||||||
|
D3D11_BLEND_INV_SRC_ALPHA,
|
||||||
|
&data->blendModeBlend);
|
||||||
|
if (FAILED(result)) {
|
||||||
|
// D3D11_CreateBlendMode will set the SDL error, if it fails
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = D3D11_CreateBlendMode(
|
||||||
|
renderer,
|
||||||
|
TRUE,
|
||||||
|
D3D11_BLEND_SRC_ALPHA,
|
||||||
|
D3D11_BLEND_ONE,
|
||||||
|
&data->blendModeAdd);
|
||||||
|
if (FAILED(result)) {
|
||||||
|
// D3D11_CreateBlendMode will set the SDL error, if it fails
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = D3D11_CreateBlendMode(
|
||||||
|
renderer,
|
||||||
|
TRUE,
|
||||||
|
D3D11_BLEND_ZERO,
|
||||||
|
D3D11_BLEND_SRC_COLOR,
|
||||||
|
&data->blendModeMod);
|
||||||
|
if (FAILED(result)) {
|
||||||
|
// D3D11_CreateBlendMode will set the SDL error, if it fails
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// All done!
|
// All done!
|
||||||
//
|
//
|
||||||
|
@ -960,6 +1027,21 @@ D3D11_RenderStartDrawOp(SDL_Renderer * renderer)
|
||||||
0,
|
0,
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
|
|
||||||
|
switch (renderer->blendMode) {
|
||||||
|
case SDL_BLENDMODE_BLEND:
|
||||||
|
rendererData->d3dContext->OMSetBlendState(rendererData->blendModeBlend.Get(), 0, 0xFFFFFFFF);
|
||||||
|
break;
|
||||||
|
case SDL_BLENDMODE_ADD:
|
||||||
|
rendererData->d3dContext->OMSetBlendState(rendererData->blendModeAdd.Get(), 0, 0xFFFFFFFF);
|
||||||
|
break;
|
||||||
|
case SDL_BLENDMODE_MOD:
|
||||||
|
rendererData->d3dContext->OMSetBlendState(rendererData->blendModeMod.Get(), 0, 0xFFFFFFFF);
|
||||||
|
break;
|
||||||
|
case SDL_BLENDMODE_NONE:
|
||||||
|
rendererData->d3dContext->OMSetBlendState(NULL, 0, 0xFFFFFFFF);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -994,10 +1076,10 @@ D3D11_RenderFillRects(SDL_Renderer * renderer,
|
||||||
D3D11_RenderData *rendererData = (D3D11_RenderData *) renderer->driverdata;
|
D3D11_RenderData *rendererData = (D3D11_RenderData *) renderer->driverdata;
|
||||||
float r, g, b, a;
|
float r, g, b, a;
|
||||||
|
|
||||||
r = (float)(renderer->r / 255);
|
r = (float)(renderer->r / 255.0f);
|
||||||
g = (float)(renderer->g / 255);
|
g = (float)(renderer->g / 255.0f);
|
||||||
b = (float)(renderer->b / 255);
|
b = (float)(renderer->b / 255.0f);
|
||||||
a = (float)(renderer->a / 255);
|
a = (float)(renderer->a / 255.0f);
|
||||||
|
|
||||||
D3D11_RenderStartDrawOp(renderer);
|
D3D11_RenderStartDrawOp(renderer);
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,9 @@ typedef struct
|
||||||
Microsoft::WRL::ComPtr<ID3D11VertexShader> vertexShader;
|
Microsoft::WRL::ComPtr<ID3D11VertexShader> vertexShader;
|
||||||
Microsoft::WRL::ComPtr<ID3D11PixelShader> texturePixelShader;
|
Microsoft::WRL::ComPtr<ID3D11PixelShader> texturePixelShader;
|
||||||
Microsoft::WRL::ComPtr<ID3D11PixelShader> colorPixelShader;
|
Microsoft::WRL::ComPtr<ID3D11PixelShader> colorPixelShader;
|
||||||
|
Microsoft::WRL::ComPtr<ID3D11BlendState> blendModeBlend;
|
||||||
|
Microsoft::WRL::ComPtr<ID3D11BlendState> blendModeAdd;
|
||||||
|
Microsoft::WRL::ComPtr<ID3D11BlendState> blendModeMod;
|
||||||
Microsoft::WRL::ComPtr<ID3D11SamplerState> mainSampler;
|
Microsoft::WRL::ComPtr<ID3D11SamplerState> mainSampler;
|
||||||
Microsoft::WRL::ComPtr<ID3D11RasterizerState> mainRasterizer;
|
Microsoft::WRL::ComPtr<ID3D11RasterizerState> mainRasterizer;
|
||||||
D3D_FEATURE_LEVEL featureLevel;
|
D3D_FEATURE_LEVEL featureLevel;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue