mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-10-08 02:46:26 +00:00
Select the shader based on the inputs, not colorspace
Fixes https://github.com/libsdl-org/SDL/issues/13880
This commit is contained in:
@@ -62,7 +62,7 @@ typedef struct
|
|||||||
} D3D11_VertexShaderConstants;
|
} D3D11_VertexShaderConstants;
|
||||||
|
|
||||||
// These should mirror the definitions in D3D11_PixelShader_Common.hlsli
|
// These should mirror the definitions in D3D11_PixelShader_Common.hlsli
|
||||||
//static const float TONEMAP_NONE = 0;
|
static const float TONEMAP_NONE = 0;
|
||||||
//static const float TONEMAP_LINEAR = 1;
|
//static const float TONEMAP_LINEAR = 1;
|
||||||
static const float TONEMAP_CHROME = 2;
|
static const float TONEMAP_CHROME = 2;
|
||||||
|
|
||||||
@@ -122,7 +122,6 @@ typedef struct
|
|||||||
ID3D11Texture2D *stagingTexture;
|
ID3D11Texture2D *stagingTexture;
|
||||||
int lockedTexturePositionX;
|
int lockedTexturePositionX;
|
||||||
int lockedTexturePositionY;
|
int lockedTexturePositionY;
|
||||||
D3D11_Shader shader;
|
|
||||||
const float *YCbCr_matrix;
|
const float *YCbCr_matrix;
|
||||||
#ifdef SDL_HAVE_YUV
|
#ifdef SDL_HAVE_YUV
|
||||||
// YV12 texture support
|
// YV12 texture support
|
||||||
@@ -1205,11 +1204,6 @@ static bool D3D11_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
|||||||
}
|
}
|
||||||
textureData->w = (int)textureDesc.Width;
|
textureData->w = (int)textureDesc.Width;
|
||||||
textureData->h = (int)textureDesc.Height;
|
textureData->h = (int)textureDesc.Height;
|
||||||
if (SDL_COLORSPACETRANSFER(texture->colorspace) == SDL_TRANSFER_CHARACTERISTICS_SRGB) {
|
|
||||||
textureData->shader = SHADER_RGB;
|
|
||||||
} else {
|
|
||||||
textureData->shader = SHADER_ADVANCED;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
|
if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
|
||||||
textureDesc.Usage = D3D11_USAGE_DYNAMIC;
|
textureDesc.Usage = D3D11_USAGE_DYNAMIC;
|
||||||
@@ -2158,8 +2152,23 @@ static void D3D11_SetupShaderConstants(SDL_Renderer *renderer, const SDL_RenderC
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static D3D11_Shader SelectShader(const D3D11_PixelShaderConstants *shader_constants)
|
||||||
|
{
|
||||||
|
if (!shader_constants) {
|
||||||
|
return SHADER_SOLID;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shader_constants->texture_type == TEXTURETYPE_RGB &&
|
||||||
|
shader_constants->input_type == INPUTTYPE_UNSPECIFIED &&
|
||||||
|
shader_constants->tonemap_method == TONEMAP_NONE) {
|
||||||
|
return SHADER_RGB;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SHADER_ADVANCED;
|
||||||
|
}
|
||||||
|
|
||||||
static bool D3D11_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd,
|
static bool D3D11_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd,
|
||||||
D3D11_Shader shader, const D3D11_PixelShaderConstants *shader_constants,
|
const D3D11_PixelShaderConstants *shader_constants,
|
||||||
const int numShaderResources, ID3D11ShaderResourceView **shaderResources,
|
const int numShaderResources, ID3D11ShaderResourceView **shaderResources,
|
||||||
ID3D11SamplerState *sampler, const Float4X4 *matrix)
|
ID3D11SamplerState *sampler, const Float4X4 *matrix)
|
||||||
|
|
||||||
@@ -2172,6 +2181,7 @@ static bool D3D11_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *
|
|||||||
const SDL_BlendMode blendMode = cmd->data.draw.blend;
|
const SDL_BlendMode blendMode = cmd->data.draw.blend;
|
||||||
ID3D11BlendState *blendState = NULL;
|
ID3D11BlendState *blendState = NULL;
|
||||||
bool updateSubresource = false;
|
bool updateSubresource = false;
|
||||||
|
D3D11_Shader shader = SelectShader(shader_constants);
|
||||||
D3D11_PixelShaderState *shader_state = &rendererData->currentShaderState[shader];
|
D3D11_PixelShaderState *shader_state = &rendererData->currentShaderState[shader];
|
||||||
D3D11_PixelShaderConstants solid_constants;
|
D3D11_PixelShaderConstants solid_constants;
|
||||||
|
|
||||||
@@ -2396,7 +2406,7 @@ static bool D3D11_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *
|
|||||||
shaderResources[1] = textureData->mainTextureResourceViewU;
|
shaderResources[1] = textureData->mainTextureResourceViewU;
|
||||||
shaderResources[2] = textureData->mainTextureResourceViewV;
|
shaderResources[2] = textureData->mainTextureResourceViewV;
|
||||||
|
|
||||||
return D3D11_SetDrawState(renderer, cmd, textureData->shader, &constants,
|
return D3D11_SetDrawState(renderer, cmd, &constants,
|
||||||
SDL_arraysize(shaderResources), shaderResources, textureSampler, matrix);
|
SDL_arraysize(shaderResources), shaderResources, textureSampler, matrix);
|
||||||
|
|
||||||
} else if (textureData->nv12) {
|
} else if (textureData->nv12) {
|
||||||
@@ -2405,11 +2415,11 @@ static bool D3D11_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *
|
|||||||
shaderResources[0] = textureData->mainTextureResourceView;
|
shaderResources[0] = textureData->mainTextureResourceView;
|
||||||
shaderResources[1] = textureData->mainTextureResourceViewNV;
|
shaderResources[1] = textureData->mainTextureResourceViewNV;
|
||||||
|
|
||||||
return D3D11_SetDrawState(renderer, cmd, textureData->shader, &constants,
|
return D3D11_SetDrawState(renderer, cmd, &constants,
|
||||||
SDL_arraysize(shaderResources), shaderResources, textureSampler, matrix);
|
SDL_arraysize(shaderResources), shaderResources, textureSampler, matrix);
|
||||||
}
|
}
|
||||||
#endif // SDL_HAVE_YUV
|
#endif // SDL_HAVE_YUV
|
||||||
return D3D11_SetDrawState(renderer, cmd, textureData->shader, &constants,
|
return D3D11_SetDrawState(renderer, cmd, &constants,
|
||||||
1, &textureData->mainTextureResourceView, textureSampler, matrix);
|
1, &textureData->mainTextureResourceView, textureSampler, matrix);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2507,7 +2517,7 @@ static bool D3D11_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
|
|||||||
const size_t count = cmd->data.draw.count;
|
const size_t count = cmd->data.draw.count;
|
||||||
const size_t first = cmd->data.draw.first;
|
const size_t first = cmd->data.draw.first;
|
||||||
const size_t start = first / sizeof(D3D11_VertexPositionColor);
|
const size_t start = first / sizeof(D3D11_VertexPositionColor);
|
||||||
D3D11_SetDrawState(renderer, cmd, SHADER_SOLID, NULL, 0, NULL, NULL, NULL);
|
D3D11_SetDrawState(renderer, cmd, NULL, 0, NULL, NULL, NULL);
|
||||||
D3D11_DrawPrimitives(renderer, D3D11_PRIMITIVE_TOPOLOGY_POINTLIST, start, count);
|
D3D11_DrawPrimitives(renderer, D3D11_PRIMITIVE_TOPOLOGY_POINTLIST, start, count);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -2518,7 +2528,7 @@ static bool D3D11_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
|
|||||||
const size_t first = cmd->data.draw.first;
|
const size_t first = cmd->data.draw.first;
|
||||||
const size_t start = first / sizeof(D3D11_VertexPositionColor);
|
const size_t start = first / sizeof(D3D11_VertexPositionColor);
|
||||||
const D3D11_VertexPositionColor *verts = (D3D11_VertexPositionColor *)(((Uint8 *)vertices) + first);
|
const D3D11_VertexPositionColor *verts = (D3D11_VertexPositionColor *)(((Uint8 *)vertices) + first);
|
||||||
D3D11_SetDrawState(renderer, cmd, SHADER_SOLID, NULL, 0, NULL, NULL, NULL);
|
D3D11_SetDrawState(renderer, cmd, NULL, 0, NULL, NULL, NULL);
|
||||||
D3D11_DrawPrimitives(renderer, D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP, start, count);
|
D3D11_DrawPrimitives(renderer, D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP, start, count);
|
||||||
if (verts[0].pos.x != verts[count - 1].pos.x || verts[0].pos.y != verts[count - 1].pos.y) {
|
if (verts[0].pos.x != verts[count - 1].pos.x || verts[0].pos.y != verts[count - 1].pos.y) {
|
||||||
D3D11_DrawPrimitives(renderer, D3D11_PRIMITIVE_TOPOLOGY_POINTLIST, start + (count - 1), 1);
|
D3D11_DrawPrimitives(renderer, D3D11_PRIMITIVE_TOPOLOGY_POINTLIST, start + (count - 1), 1);
|
||||||
@@ -2545,7 +2555,7 @@ static bool D3D11_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
|
|||||||
if (texture) {
|
if (texture) {
|
||||||
D3D11_SetCopyState(renderer, cmd, NULL);
|
D3D11_SetCopyState(renderer, cmd, NULL);
|
||||||
} else {
|
} else {
|
||||||
D3D11_SetDrawState(renderer, cmd, SHADER_SOLID, NULL, 0, NULL, NULL, NULL);
|
D3D11_SetDrawState(renderer, cmd, NULL, 0, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D11_DrawPrimitives(renderer, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, start, count);
|
D3D11_DrawPrimitives(renderer, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, start, count);
|
||||||
|
@@ -64,7 +64,7 @@ typedef struct
|
|||||||
} D3D12_VertexShaderConstants;
|
} D3D12_VertexShaderConstants;
|
||||||
|
|
||||||
// These should mirror the definitions in D3D12_PixelShader_Common.hlsli
|
// These should mirror the definitions in D3D12_PixelShader_Common.hlsli
|
||||||
//static const float TONEMAP_NONE = 0;
|
static const float TONEMAP_NONE = 0;
|
||||||
//static const float TONEMAP_LINEAR = 1;
|
//static const float TONEMAP_LINEAR = 1;
|
||||||
static const float TONEMAP_CHROME = 2;
|
static const float TONEMAP_CHROME = 2;
|
||||||
|
|
||||||
@@ -120,7 +120,6 @@ typedef struct
|
|||||||
DXGI_FORMAT mainTextureFormat;
|
DXGI_FORMAT mainTextureFormat;
|
||||||
ID3D12Resource *stagingBuffer;
|
ID3D12Resource *stagingBuffer;
|
||||||
D3D12_RESOURCE_STATES stagingResourceState;
|
D3D12_RESOURCE_STATES stagingResourceState;
|
||||||
D3D12_Shader shader;
|
|
||||||
const float *YCbCr_matrix;
|
const float *YCbCr_matrix;
|
||||||
#ifdef SDL_HAVE_YUV
|
#ifdef SDL_HAVE_YUV
|
||||||
// YV12 texture support
|
// YV12 texture support
|
||||||
@@ -1572,11 +1571,6 @@ static bool D3D12_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
|||||||
}
|
}
|
||||||
textureData->w = (int)textureDesc.Width;
|
textureData->w = (int)textureDesc.Width;
|
||||||
textureData->h = (int)textureDesc.Height;
|
textureData->h = (int)textureDesc.Height;
|
||||||
if (SDL_COLORSPACETRANSFER(texture->colorspace) == SDL_TRANSFER_CHARACTERISTICS_SRGB) {
|
|
||||||
textureData->shader = SHADER_RGB;
|
|
||||||
} else {
|
|
||||||
textureData->shader = SHADER_ADVANCED;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (texture->access == SDL_TEXTUREACCESS_TARGET) {
|
if (texture->access == SDL_TEXTUREACCESS_TARGET) {
|
||||||
textureDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
|
textureDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
|
||||||
@@ -2562,7 +2556,22 @@ static void D3D12_SetupShaderConstants(SDL_Renderer *renderer, const SDL_RenderC
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool D3D12_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, D3D12_Shader shader, const D3D12_PixelShaderConstants *shader_constants,
|
static D3D12_Shader SelectShader(const D3D12_PixelShaderConstants *shader_constants)
|
||||||
|
{
|
||||||
|
if (!shader_constants) {
|
||||||
|
return SHADER_SOLID;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shader_constants->texture_type == TEXTURETYPE_RGB &&
|
||||||
|
shader_constants->input_type == INPUTTYPE_UNSPECIFIED &&
|
||||||
|
shader_constants->tonemap_method == TONEMAP_NONE) {
|
||||||
|
return SHADER_RGB;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SHADER_ADVANCED;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool D3D12_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, const D3D12_PixelShaderConstants *shader_constants,
|
||||||
D3D12_PRIMITIVE_TOPOLOGY_TYPE topology,
|
D3D12_PRIMITIVE_TOPOLOGY_TYPE topology,
|
||||||
const int numShaderResources, D3D12_CPU_DESCRIPTOR_HANDLE *shaderResources,
|
const int numShaderResources, D3D12_CPU_DESCRIPTOR_HANDLE *shaderResources,
|
||||||
D3D12_CPU_DESCRIPTOR_HANDLE *sampler, const Float4X4 *matrix)
|
D3D12_CPU_DESCRIPTOR_HANDLE *sampler, const Float4X4 *matrix)
|
||||||
@@ -2576,7 +2585,8 @@ static bool D3D12_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *
|
|||||||
int i;
|
int i;
|
||||||
D3D12_CPU_DESCRIPTOR_HANDLE firstShaderResource;
|
D3D12_CPU_DESCRIPTOR_HANDLE firstShaderResource;
|
||||||
DXGI_FORMAT rtvFormat = rendererData->renderTargetFormat;
|
DXGI_FORMAT rtvFormat = rendererData->renderTargetFormat;
|
||||||
D3D12_PipelineState *currentPipelineState = rendererData->currentPipelineState;;
|
D3D12_PipelineState *currentPipelineState = rendererData->currentPipelineState;
|
||||||
|
D3D12_Shader shader = SelectShader(shader_constants);
|
||||||
D3D12_PixelShaderConstants solid_constants;
|
D3D12_PixelShaderConstants solid_constants;
|
||||||
|
|
||||||
if (rendererData->textureRenderTarget) {
|
if (rendererData->textureRenderTarget) {
|
||||||
@@ -2800,7 +2810,7 @@ static bool D3D12_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *
|
|||||||
D3D12_TransitionResource(rendererData, textureData->mainTextureV, textureData->mainResourceStateV, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
|
D3D12_TransitionResource(rendererData, textureData->mainTextureV, textureData->mainResourceStateV, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
|
||||||
textureData->mainResourceStateV = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
|
textureData->mainResourceStateV = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
|
||||||
|
|
||||||
return D3D12_SetDrawState(renderer, cmd, textureData->shader, &constants, D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE, SDL_arraysize(shaderResources), shaderResources, textureSampler, matrix);
|
return D3D12_SetDrawState(renderer, cmd, &constants, D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE, SDL_arraysize(shaderResources), shaderResources, textureSampler, matrix);
|
||||||
} else if (textureData->nv12) {
|
} else if (textureData->nv12) {
|
||||||
D3D12_CPU_DESCRIPTOR_HANDLE shaderResources[2];
|
D3D12_CPU_DESCRIPTOR_HANDLE shaderResources[2];
|
||||||
|
|
||||||
@@ -2811,12 +2821,12 @@ static bool D3D12_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *
|
|||||||
D3D12_TransitionResource(rendererData, textureData->mainTexture, textureData->mainResourceState, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
|
D3D12_TransitionResource(rendererData, textureData->mainTexture, textureData->mainResourceState, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
|
||||||
textureData->mainResourceState = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
|
textureData->mainResourceState = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
|
||||||
|
|
||||||
return D3D12_SetDrawState(renderer, cmd, textureData->shader, &constants, D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE, SDL_arraysize(shaderResources), shaderResources, textureSampler, matrix);
|
return D3D12_SetDrawState(renderer, cmd, &constants, D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE, SDL_arraysize(shaderResources), shaderResources, textureSampler, matrix);
|
||||||
}
|
}
|
||||||
#endif // SDL_HAVE_YUV
|
#endif // SDL_HAVE_YUV
|
||||||
D3D12_TransitionResource(rendererData, textureData->mainTexture, textureData->mainResourceState, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
|
D3D12_TransitionResource(rendererData, textureData->mainTexture, textureData->mainResourceState, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
|
||||||
textureData->mainResourceState = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
|
textureData->mainResourceState = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
|
||||||
return D3D12_SetDrawState(renderer, cmd, textureData->shader, &constants, D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE, 1, &textureData->mainTextureResourceView, textureSampler, matrix);
|
return D3D12_SetDrawState(renderer, cmd, &constants, D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE, 1, &textureData->mainTextureResourceView, textureSampler, matrix);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void D3D12_DrawPrimitives(SDL_Renderer *renderer, D3D12_PRIMITIVE_TOPOLOGY primitiveTopology, const size_t vertexStart, const size_t vertexCount)
|
static void D3D12_DrawPrimitives(SDL_Renderer *renderer, D3D12_PRIMITIVE_TOPOLOGY primitiveTopology, const size_t vertexStart, const size_t vertexCount)
|
||||||
@@ -2921,7 +2931,7 @@ static bool D3D12_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
|
|||||||
const size_t count = cmd->data.draw.count;
|
const size_t count = cmd->data.draw.count;
|
||||||
const size_t first = cmd->data.draw.first;
|
const size_t first = cmd->data.draw.first;
|
||||||
const size_t start = first / sizeof(D3D12_VertexPositionColor);
|
const size_t start = first / sizeof(D3D12_VertexPositionColor);
|
||||||
D3D12_SetDrawState(renderer, cmd, SHADER_SOLID, NULL, D3D12_PRIMITIVE_TOPOLOGY_TYPE_POINT, 0, NULL, NULL, NULL);
|
D3D12_SetDrawState(renderer, cmd, NULL, D3D12_PRIMITIVE_TOPOLOGY_TYPE_POINT, 0, NULL, NULL, NULL);
|
||||||
D3D12_DrawPrimitives(renderer, D3D_PRIMITIVE_TOPOLOGY_POINTLIST, start, count);
|
D3D12_DrawPrimitives(renderer, D3D_PRIMITIVE_TOPOLOGY_POINTLIST, start, count);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -2932,7 +2942,7 @@ static bool D3D12_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
|
|||||||
const size_t first = cmd->data.draw.first;
|
const size_t first = cmd->data.draw.first;
|
||||||
const size_t start = first / sizeof(D3D12_VertexPositionColor);
|
const size_t start = first / sizeof(D3D12_VertexPositionColor);
|
||||||
const D3D12_VertexPositionColor *verts = (D3D12_VertexPositionColor *)(((Uint8 *)vertices) + first);
|
const D3D12_VertexPositionColor *verts = (D3D12_VertexPositionColor *)(((Uint8 *)vertices) + first);
|
||||||
D3D12_SetDrawState(renderer, cmd, SHADER_SOLID, NULL, D3D12_PRIMITIVE_TOPOLOGY_TYPE_LINE, 0, NULL, NULL, NULL);
|
D3D12_SetDrawState(renderer, cmd, NULL, D3D12_PRIMITIVE_TOPOLOGY_TYPE_LINE, 0, NULL, NULL, NULL);
|
||||||
D3D12_DrawPrimitives(renderer, D3D_PRIMITIVE_TOPOLOGY_LINESTRIP, start, count);
|
D3D12_DrawPrimitives(renderer, D3D_PRIMITIVE_TOPOLOGY_LINESTRIP, start, count);
|
||||||
if (verts[0].pos.x != verts[count - 1].pos.x || verts[0].pos.y != verts[count - 1].pos.y) {
|
if (verts[0].pos.x != verts[count - 1].pos.x || verts[0].pos.y != verts[count - 1].pos.y) {
|
||||||
D3D12_DrawPrimitives(renderer, D3D_PRIMITIVE_TOPOLOGY_POINTLIST, start + (count - 1), 1);
|
D3D12_DrawPrimitives(renderer, D3D_PRIMITIVE_TOPOLOGY_POINTLIST, start + (count - 1), 1);
|
||||||
@@ -2959,7 +2969,7 @@ static bool D3D12_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
|
|||||||
if (texture) {
|
if (texture) {
|
||||||
D3D12_SetCopyState(renderer, cmd, NULL);
|
D3D12_SetCopyState(renderer, cmd, NULL);
|
||||||
} else {
|
} else {
|
||||||
D3D12_SetDrawState(renderer, cmd, SHADER_SOLID, NULL, D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE, 0, NULL, NULL, NULL);
|
D3D12_SetDrawState(renderer, cmd, NULL, D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE, 0, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D12_DrawPrimitives(renderer, D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST, start, count);
|
D3D12_DrawPrimitives(renderer, D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST, start, count);
|
||||||
|
@@ -177,7 +177,7 @@ typedef struct
|
|||||||
} VULKAN_VertexShaderConstants;
|
} VULKAN_VertexShaderConstants;
|
||||||
|
|
||||||
// These should mirror the definitions in VULKAN_PixelShader_Common.hlsli
|
// These should mirror the definitions in VULKAN_PixelShader_Common.hlsli
|
||||||
//static const float TONEMAP_NONE = 0;
|
static const float TONEMAP_NONE = 0;
|
||||||
//static const float TONEMAP_LINEAR = 1;
|
//static const float TONEMAP_LINEAR = 1;
|
||||||
static const float TONEMAP_CHROME = 2;
|
static const float TONEMAP_CHROME = 2;
|
||||||
|
|
||||||
@@ -244,7 +244,6 @@ typedef struct
|
|||||||
SDL_Rect lockedRect;
|
SDL_Rect lockedRect;
|
||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
VULKAN_Shader shader;
|
|
||||||
|
|
||||||
// Object passed to VkImageView and VkSampler for doing Ycbcr -> RGB conversion
|
// Object passed to VkImageView and VkSampler for doing Ycbcr -> RGB conversion
|
||||||
VkSamplerYcbcrConversion samplerYcbcrConversion;
|
VkSamplerYcbcrConversion samplerYcbcrConversion;
|
||||||
@@ -2544,11 +2543,6 @@ static bool VULKAN_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, S
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
texture->internal = textureData;
|
texture->internal = textureData;
|
||||||
if (SDL_COLORSPACETRANSFER(texture->colorspace) == SDL_TRANSFER_CHARACTERISTICS_SRGB) {
|
|
||||||
textureData->shader = SHADER_RGB;
|
|
||||||
} else {
|
|
||||||
textureData->shader = SHADER_ADVANCED;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef SDL_HAVE_YUV
|
#ifdef SDL_HAVE_YUV
|
||||||
// YUV textures must have even width and height. Also create Ycbcr conversion
|
// YUV textures must have even width and height. Also create Ycbcr conversion
|
||||||
@@ -3386,6 +3380,21 @@ static void VULKAN_SetupShaderConstants(SDL_Renderer *renderer, const SDL_Render
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VULKAN_Shader SelectShader(const VULKAN_PixelShaderConstants *shader_constants)
|
||||||
|
{
|
||||||
|
if (!shader_constants) {
|
||||||
|
return SHADER_SOLID;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!shader_constants->pixel_art &&
|
||||||
|
shader_constants->input_type == INPUTTYPE_UNSPECIFIED &&
|
||||||
|
shader_constants->tonemap_method == TONEMAP_NONE) {
|
||||||
|
return SHADER_RGB;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SHADER_ADVANCED;
|
||||||
|
}
|
||||||
|
|
||||||
static VkDescriptorPool VULKAN_AllocateDescriptorPool(VULKAN_RenderData *rendererData)
|
static VkDescriptorPool VULKAN_AllocateDescriptorPool(VULKAN_RenderData *rendererData)
|
||||||
{
|
{
|
||||||
VkDescriptorPool descriptorPool = VK_NULL_HANDLE;
|
VkDescriptorPool descriptorPool = VK_NULL_HANDLE;
|
||||||
@@ -3561,7 +3570,7 @@ static VkDescriptorSet VULKAN_AllocateDescriptorSet(SDL_Renderer *renderer, VULK
|
|||||||
return descriptorSet;
|
return descriptorSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool VULKAN_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, VULKAN_Shader shader, VkPipelineLayout pipelineLayout, VkDescriptorSetLayout descriptorSetLayout,
|
static bool VULKAN_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, VkPipelineLayout pipelineLayout, VkDescriptorSetLayout descriptorSetLayout,
|
||||||
const VULKAN_PixelShaderConstants *shader_constants, VkPrimitiveTopology topology, VkImageView imageView, VkSampler sampler, const Float4X4 *matrix, VULKAN_DrawStateCache *stateCache)
|
const VULKAN_PixelShaderConstants *shader_constants, VkPrimitiveTopology topology, VkImageView imageView, VkSampler sampler, const Float4X4 *matrix, VULKAN_DrawStateCache *stateCache)
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -3570,6 +3579,7 @@ static bool VULKAN_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand
|
|||||||
VkFormat format = rendererData->surfaceFormat.format;
|
VkFormat format = rendererData->surfaceFormat.format;
|
||||||
const Float4X4 *newmatrix = matrix ? matrix : &rendererData->identity;
|
const Float4X4 *newmatrix = matrix ? matrix : &rendererData->identity;
|
||||||
bool updateConstants = false;
|
bool updateConstants = false;
|
||||||
|
VULKAN_Shader shader = SelectShader(shader_constants);
|
||||||
VULKAN_PixelShaderConstants solid_constants;
|
VULKAN_PixelShaderConstants solid_constants;
|
||||||
VkDescriptorSet descriptorSet;
|
VkDescriptorSet descriptorSet;
|
||||||
VkBuffer constantBuffer;
|
VkBuffer constantBuffer;
|
||||||
@@ -3805,7 +3815,7 @@ static bool VULKAN_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return VULKAN_SetDrawState(renderer, cmd, textureData->shader, pipelineLayout, descriptorSetLayout, &constants, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, textureData->mainImage.imageView, textureSampler, matrix, stateCache);
|
return VULKAN_SetDrawState(renderer, cmd, pipelineLayout, descriptorSetLayout, &constants, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, textureData->mainImage.imageView, textureSampler, matrix, stateCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void VULKAN_DrawPrimitives(SDL_Renderer *renderer, VkPrimitiveTopology primitiveTopology, const size_t vertexStart, const size_t vertexCount)
|
static void VULKAN_DrawPrimitives(SDL_Renderer *renderer, VkPrimitiveTopology primitiveTopology, const size_t vertexStart, const size_t vertexCount)
|
||||||
@@ -3906,7 +3916,7 @@ static bool VULKAN_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cm
|
|||||||
const size_t count = cmd->data.draw.count;
|
const size_t count = cmd->data.draw.count;
|
||||||
const size_t first = cmd->data.draw.first;
|
const size_t first = cmd->data.draw.first;
|
||||||
const size_t start = first / sizeof(VULKAN_VertexPositionColor);
|
const size_t start = first / sizeof(VULKAN_VertexPositionColor);
|
||||||
VULKAN_SetDrawState(renderer, cmd, SHADER_SOLID, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_NULL_HANDLE, VK_NULL_HANDLE, NULL, &stateCache);
|
VULKAN_SetDrawState(renderer, cmd, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_NULL_HANDLE, VK_NULL_HANDLE, NULL, &stateCache);
|
||||||
VULKAN_DrawPrimitives(renderer, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, start, count);
|
VULKAN_DrawPrimitives(renderer, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, start, count);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -3917,10 +3927,10 @@ static bool VULKAN_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cm
|
|||||||
const size_t first = cmd->data.draw.first;
|
const size_t first = cmd->data.draw.first;
|
||||||
const size_t start = first / sizeof(VULKAN_VertexPositionColor);
|
const size_t start = first / sizeof(VULKAN_VertexPositionColor);
|
||||||
const VULKAN_VertexPositionColor *verts = (VULKAN_VertexPositionColor *)(((Uint8 *)vertices) + first);
|
const VULKAN_VertexPositionColor *verts = (VULKAN_VertexPositionColor *)(((Uint8 *)vertices) + first);
|
||||||
VULKAN_SetDrawState(renderer, cmd, SHADER_SOLID, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, VK_NULL_HANDLE, VK_NULL_HANDLE, NULL, &stateCache);
|
VULKAN_SetDrawState(renderer, cmd, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, VK_NULL_HANDLE, VK_NULL_HANDLE, NULL, &stateCache);
|
||||||
VULKAN_DrawPrimitives(renderer, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, start, count);
|
VULKAN_DrawPrimitives(renderer, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, start, count);
|
||||||
if (verts[0].pos[0] != verts[count - 1].pos[0] || verts[0].pos[1] != verts[count - 1].pos[1]) {
|
if (verts[0].pos[0] != verts[count - 1].pos[0] || verts[0].pos[1] != verts[count - 1].pos[1]) {
|
||||||
VULKAN_SetDrawState(renderer, cmd, SHADER_SOLID, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_NULL_HANDLE, VK_NULL_HANDLE, NULL, &stateCache);
|
VULKAN_SetDrawState(renderer, cmd, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_NULL_HANDLE, VK_NULL_HANDLE, NULL, &stateCache);
|
||||||
VULKAN_DrawPrimitives(renderer, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, start + (count - 1), 1);
|
VULKAN_DrawPrimitives(renderer, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, start + (count - 1), 1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -3945,7 +3955,7 @@ static bool VULKAN_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cm
|
|||||||
if (texture) {
|
if (texture) {
|
||||||
VULKAN_SetCopyState(renderer, cmd, NULL, &stateCache);
|
VULKAN_SetCopyState(renderer, cmd, NULL, &stateCache);
|
||||||
} else {
|
} else {
|
||||||
VULKAN_SetDrawState(renderer, cmd, SHADER_SOLID, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, VK_NULL_HANDLE, VK_NULL_HANDLE, NULL, &stateCache);
|
VULKAN_SetDrawState(renderer, cmd, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, VK_NULL_HANDLE, VK_NULL_HANDLE, NULL, &stateCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
VULKAN_DrawPrimitives(renderer, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, start, count);
|
VULKAN_DrawPrimitives(renderer, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, start, count);
|
||||||
|
Reference in New Issue
Block a user