mirror of https://github.com/encounter/SDL.git
direct3d: Implement missing blend operations.
This is only for Direct3D 9; Direct3D 11 already had this implemented. Fixes #5375.
This commit is contained in:
parent
a630b02938
commit
7bc498d325
|
@ -67,9 +67,8 @@ typedef enum
|
||||||
SDL_BLENDOPERATION_ADD = 0x1, /**< dst + src: supported by all renderers */
|
SDL_BLENDOPERATION_ADD = 0x1, /**< dst + src: supported by all renderers */
|
||||||
SDL_BLENDOPERATION_SUBTRACT = 0x2, /**< dst - src : supported by D3D9, D3D11, OpenGL, OpenGLES */
|
SDL_BLENDOPERATION_SUBTRACT = 0x2, /**< dst - src : supported by D3D9, D3D11, OpenGL, OpenGLES */
|
||||||
SDL_BLENDOPERATION_REV_SUBTRACT = 0x3, /**< src - dst : supported by D3D9, D3D11, OpenGL, OpenGLES */
|
SDL_BLENDOPERATION_REV_SUBTRACT = 0x3, /**< src - dst : supported by D3D9, D3D11, OpenGL, OpenGLES */
|
||||||
SDL_BLENDOPERATION_MINIMUM = 0x4, /**< min(dst, src) : supported by D3D11 */
|
SDL_BLENDOPERATION_MINIMUM = 0x4, /**< min(dst, src) : supported by D3D9, D3D11 */
|
||||||
SDL_BLENDOPERATION_MAXIMUM = 0x5 /**< max(dst, src) : supported by D3D11 */
|
SDL_BLENDOPERATION_MAXIMUM = 0x5 /**< max(dst, src) : supported by D3D9, D3D11 */
|
||||||
|
|
||||||
} SDL_BlendOperation;
|
} SDL_BlendOperation;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -87,7 +86,6 @@ typedef enum
|
||||||
SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR = 0x8, /**< 1-dstR, 1-dstG, 1-dstB, 1-dstA */
|
SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR = 0x8, /**< 1-dstR, 1-dstG, 1-dstB, 1-dstA */
|
||||||
SDL_BLENDFACTOR_DST_ALPHA = 0x9, /**< dstA, dstA, dstA, dstA */
|
SDL_BLENDFACTOR_DST_ALPHA = 0x9, /**< dstA, dstA, dstA, dstA */
|
||||||
SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA = 0xA /**< 1-dstA, 1-dstA, 1-dstA, 1-dstA */
|
SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA = 0xA /**< 1-dstA, 1-dstA, 1-dstA, 1-dstA */
|
||||||
|
|
||||||
} SDL_BlendFactor;
|
} SDL_BlendFactor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -135,10 +133,10 @@ typedef enum
|
||||||
* SDL 2.0.6. All renderers support the four blend modes listed in the
|
* SDL 2.0.6. All renderers support the four blend modes listed in the
|
||||||
* SDL_BlendMode enumeration.
|
* SDL_BlendMode enumeration.
|
||||||
*
|
*
|
||||||
* - **direct3d**: Supports `SDL_BLENDOPERATION_ADD` with all factors.
|
* - **direct3d**: Supports all operations with all factors. However, some
|
||||||
* - **direct3d11**: Supports all operations with all factors. However, some
|
|
||||||
* factors produce unexpected results with `SDL_BLENDOPERATION_MINIMUM` and
|
* factors produce unexpected results with `SDL_BLENDOPERATION_MINIMUM` and
|
||||||
* `SDL_BLENDOPERATION_MAXIMUM`.
|
* `SDL_BLENDOPERATION_MAXIMUM`.
|
||||||
|
* - **direct3d11**: Same as Direct3D 9.
|
||||||
* - **opengl**: Supports the `SDL_BLENDOPERATION_ADD` operation with all
|
* - **opengl**: Supports the `SDL_BLENDOPERATION_ADD` operation with all
|
||||||
* factors. OpenGL versions 1.1, 1.2, and 1.3 do not work correctly with SDL
|
* factors. OpenGL versions 1.1, 1.2, and 1.3 do not work correctly with SDL
|
||||||
* 2.0.6.
|
* 2.0.6.
|
||||||
|
|
|
@ -347,7 +347,8 @@ D3D_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static D3DBLEND GetBlendFunc(SDL_BlendFactor factor)
|
static D3DBLEND
|
||||||
|
GetBlendFunc(SDL_BlendFactor factor)
|
||||||
{
|
{
|
||||||
switch (factor) {
|
switch (factor) {
|
||||||
case SDL_BLENDFACTOR_ZERO:
|
case SDL_BLENDFACTOR_ZERO:
|
||||||
|
@ -370,9 +371,28 @@ static D3DBLEND GetBlendFunc(SDL_BlendFactor factor)
|
||||||
return D3DBLEND_DESTALPHA;
|
return D3DBLEND_DESTALPHA;
|
||||||
case SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA:
|
case SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA:
|
||||||
return D3DBLEND_INVDESTALPHA;
|
return D3DBLEND_INVDESTALPHA;
|
||||||
default:
|
default: break;
|
||||||
return (D3DBLEND)0;
|
|
||||||
}
|
}
|
||||||
|
return (D3DBLEND) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static D3DBLENDOP
|
||||||
|
GetBlendEquation(SDL_BlendOperation operation)
|
||||||
|
{
|
||||||
|
switch (operation) {
|
||||||
|
case SDL_BLENDOPERATION_ADD:
|
||||||
|
return D3DBLENDOP_ADD;
|
||||||
|
case SDL_BLENDOPERATION_SUBTRACT:
|
||||||
|
return D3DBLENDOP_SUBTRACT;
|
||||||
|
case SDL_BLENDOPERATION_REV_SUBTRACT:
|
||||||
|
return D3DBLENDOP_REVSUBTRACT;
|
||||||
|
case SDL_BLENDOPERATION_MINIMUM:
|
||||||
|
return D3DBLENDOP_MIN;
|
||||||
|
case SDL_BLENDOPERATION_MAXIMUM:
|
||||||
|
return D3DBLENDOP_MAX;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
return (D3DBLENDOP) 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SDL_bool
|
static SDL_bool
|
||||||
|
@ -387,14 +407,16 @@ D3D_SupportsBlendMode(SDL_Renderer * renderer, SDL_BlendMode blendMode)
|
||||||
SDL_BlendOperation alphaOperation = SDL_GetBlendModeAlphaOperation(blendMode);
|
SDL_BlendOperation alphaOperation = SDL_GetBlendModeAlphaOperation(blendMode);
|
||||||
|
|
||||||
if (!GetBlendFunc(srcColorFactor) || !GetBlendFunc(srcAlphaFactor) ||
|
if (!GetBlendFunc(srcColorFactor) || !GetBlendFunc(srcAlphaFactor) ||
|
||||||
!GetBlendFunc(dstColorFactor) || !GetBlendFunc(dstAlphaFactor)) {
|
!GetBlendEquation(colorOperation) ||
|
||||||
|
!GetBlendFunc(dstColorFactor) || !GetBlendFunc(dstAlphaFactor) ||
|
||||||
|
!GetBlendEquation(alphaOperation)) {
|
||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
}
|
}
|
||||||
if ((srcColorFactor != srcAlphaFactor || dstColorFactor != dstAlphaFactor) && !data->enableSeparateAlphaBlend) {
|
|
||||||
|
if (!data->enableSeparateAlphaBlend) {
|
||||||
|
if ((srcColorFactor != srcAlphaFactor) || (dstColorFactor != dstAlphaFactor) || (colorOperation != alphaOperation)) {
|
||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
}
|
}
|
||||||
if (colorOperation != SDL_BLENDOPERATION_ADD || alphaOperation != SDL_BLENDOPERATION_ADD) {
|
|
||||||
return SDL_FALSE;
|
|
||||||
}
|
}
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
}
|
}
|
||||||
|
@ -1040,11 +1062,15 @@ SetDrawState(D3D_RenderData *data, const SDL_RenderCommand *cmd)
|
||||||
GetBlendFunc(SDL_GetBlendModeSrcColorFactor(blend)));
|
GetBlendFunc(SDL_GetBlendModeSrcColorFactor(blend)));
|
||||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND,
|
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND,
|
||||||
GetBlendFunc(SDL_GetBlendModeDstColorFactor(blend)));
|
GetBlendFunc(SDL_GetBlendModeDstColorFactor(blend)));
|
||||||
|
IDirect3DDevice9_SetRenderState(data->device, D3DRS_BLENDOP,
|
||||||
|
GetBlendEquation(SDL_GetBlendModeColorOperation(blend)));
|
||||||
if (data->enableSeparateAlphaBlend) {
|
if (data->enableSeparateAlphaBlend) {
|
||||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLENDALPHA,
|
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLENDALPHA,
|
||||||
GetBlendFunc(SDL_GetBlendModeSrcAlphaFactor(blend)));
|
GetBlendFunc(SDL_GetBlendModeSrcAlphaFactor(blend)));
|
||||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLENDALPHA,
|
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLENDALPHA,
|
||||||
GetBlendFunc(SDL_GetBlendModeDstAlphaFactor(blend)));
|
GetBlendFunc(SDL_GetBlendModeDstAlphaFactor(blend)));
|
||||||
|
IDirect3DDevice9_SetRenderState(data->device, D3DRS_BLENDOPALPHA,
|
||||||
|
GetBlendEquation(SDL_GetBlendModeAlphaOperation(blend)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue