mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-04-24 16:25:49 +00:00
Make texture scale mode a part of the 2D renderer draw state
Also added texture addressing mode support to the PSP and Vita renderers (untested) Fixes https://github.com/libsdl-org/SDL/issues/12461
This commit is contained in:
@@ -60,7 +60,7 @@ typedef struct
|
||||
bool updateSize;
|
||||
bool beginScene;
|
||||
bool enableSeparateAlphaBlend;
|
||||
D3DTEXTUREFILTERTYPE scaleMode[3];
|
||||
SDL_ScaleMode scaleMode[3];
|
||||
SDL_TextureAddressMode addressMode[3];
|
||||
IDirect3DSurface9 *defaultRenderTarget;
|
||||
IDirect3DSurface9 *currentRenderTarget;
|
||||
@@ -89,7 +89,6 @@ typedef struct
|
||||
typedef struct
|
||||
{
|
||||
D3D_TextureRep texture;
|
||||
D3DTEXTUREFILTERTYPE scaleMode;
|
||||
D3D9_Shader shader;
|
||||
const float *shader_params;
|
||||
|
||||
@@ -274,10 +273,14 @@ static void D3D_InitRenderState(D3D_RenderData *data)
|
||||
IDirect3DDevice9_SetTransform(device, D3DTS_VIEW, &matrix);
|
||||
|
||||
// Reset our current scale mode
|
||||
SDL_memset(data->scaleMode, 0xFF, sizeof(data->scaleMode));
|
||||
for (int i = 0; i < SDL_arraysize(data->scaleMode); ++i) {
|
||||
data->scaleMode[i] = SDL_SCALEMODE_INVALID;
|
||||
}
|
||||
|
||||
// Reset our current address mode
|
||||
SDL_zeroa(data->addressMode);
|
||||
for (int i = 0; i < SDL_arraysize(data->addressMode); ++i) {
|
||||
data->addressMode[i] = SDL_TEXTURE_ADDRESS_INVALID;
|
||||
}
|
||||
|
||||
// Start the render with beginScene
|
||||
data->beginScene = true;
|
||||
@@ -533,7 +536,6 @@ static bool D3D_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_
|
||||
if (!texturedata) {
|
||||
return false;
|
||||
}
|
||||
texturedata->scaleMode = (texture->scaleMode == SDL_SCALEMODE_NEAREST) ? D3DTEXF_POINT : D3DTEXF_LINEAR;
|
||||
|
||||
texture->internal = texturedata;
|
||||
|
||||
@@ -736,17 +738,6 @@ static void D3D_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
}
|
||||
}
|
||||
|
||||
static void D3D_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
|
||||
{
|
||||
D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
|
||||
|
||||
if (!texturedata) {
|
||||
return;
|
||||
}
|
||||
|
||||
texturedata->scaleMode = (scaleMode == SDL_SCALEMODE_NEAREST) ? D3DTEXF_POINT : D3DTEXF_LINEAR;
|
||||
}
|
||||
|
||||
static bool D3D_SetRenderTargetInternal(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
{
|
||||
D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
|
||||
@@ -926,12 +917,22 @@ static bool BindTextureRep(IDirect3DDevice9 *device, D3D_TextureRep *texture, DW
|
||||
return true;
|
||||
}
|
||||
|
||||
static void UpdateTextureScaleMode(D3D_RenderData *data, D3D_TextureData *texturedata, unsigned index)
|
||||
static void UpdateTextureScaleMode(D3D_RenderData *data, SDL_ScaleMode scaleMode, unsigned index)
|
||||
{
|
||||
if (texturedata->scaleMode != data->scaleMode[index]) {
|
||||
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MINFILTER, texturedata->scaleMode);
|
||||
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MAGFILTER, texturedata->scaleMode);
|
||||
data->scaleMode[index] = texturedata->scaleMode;
|
||||
if (scaleMode != data->scaleMode[index]) {
|
||||
switch (scaleMode) {
|
||||
case SDL_SCALEMODE_NEAREST:
|
||||
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MINFILTER, D3DTEXF_POINT);
|
||||
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
|
||||
break;
|
||||
case SDL_SCALEMODE_LINEAR:
|
||||
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
|
||||
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
data->scaleMode[index] = scaleMode;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -954,7 +955,7 @@ static void UpdateTextureAddressMode(D3D_RenderData *data, SDL_TextureAddressMod
|
||||
}
|
||||
}
|
||||
|
||||
static bool SetupTextureState(D3D_RenderData *data, SDL_Texture *texture, SDL_TextureAddressMode addressMode, D3D9_Shader *shader, const float **shader_params)
|
||||
static bool SetupTextureState(D3D_RenderData *data, SDL_Texture *texture, D3D9_Shader *shader, const float **shader_params)
|
||||
{
|
||||
D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
|
||||
|
||||
@@ -962,9 +963,6 @@ static bool SetupTextureState(D3D_RenderData *data, SDL_Texture *texture, SDL_Te
|
||||
return SDL_SetError("Texture is not currently available");
|
||||
}
|
||||
|
||||
UpdateTextureScaleMode(data, texturedata, 0);
|
||||
UpdateTextureAddressMode(data, addressMode, 0);
|
||||
|
||||
*shader = texturedata->shader;
|
||||
*shader_params = texturedata->shader_params;
|
||||
|
||||
@@ -973,11 +971,6 @@ static bool SetupTextureState(D3D_RenderData *data, SDL_Texture *texture, SDL_Te
|
||||
}
|
||||
#ifdef SDL_HAVE_YUV
|
||||
if (texturedata->yuv) {
|
||||
UpdateTextureScaleMode(data, texturedata, 1);
|
||||
UpdateTextureScaleMode(data, texturedata, 2);
|
||||
UpdateTextureAddressMode(data, addressMode, 1);
|
||||
UpdateTextureAddressMode(data, addressMode, 2);
|
||||
|
||||
if (!BindTextureRep(data->device, &texturedata->utexture, 1)) {
|
||||
return false;
|
||||
}
|
||||
@@ -1012,7 +1005,7 @@ static bool SetDrawState(D3D_RenderData *data, const SDL_RenderCommand *cmd)
|
||||
IDirect3DDevice9_SetTexture(data->device, 2, NULL);
|
||||
}
|
||||
#endif
|
||||
if (texture && !SetupTextureState(data, texture, cmd->data.draw.texture_address_mode, &shader, &shader_params)) {
|
||||
if (texture && !SetupTextureState(data, texture, &shader, &shader_params)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1049,6 +1042,20 @@ static bool SetDrawState(D3D_RenderData *data, const SDL_RenderCommand *cmd)
|
||||
#endif
|
||||
}
|
||||
|
||||
if (texture) {
|
||||
D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
|
||||
|
||||
UpdateTextureScaleMode(data, cmd->data.draw.texture_scale_mode, 0);
|
||||
UpdateTextureAddressMode(data, cmd->data.draw.texture_address_mode, 0);
|
||||
|
||||
if (texturedata && texturedata->yuv) {
|
||||
UpdateTextureScaleMode(data, cmd->data.draw.texture_scale_mode, 1);
|
||||
UpdateTextureScaleMode(data, cmd->data.draw.texture_scale_mode, 2);
|
||||
UpdateTextureAddressMode(data, cmd->data.draw.texture_address_mode, 1);
|
||||
UpdateTextureAddressMode(data, cmd->data.draw.texture_address_mode, 2);
|
||||
}
|
||||
}
|
||||
|
||||
if (blend != data->drawstate.blend) {
|
||||
if (blend == SDL_BLENDMODE_NONE) {
|
||||
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE, FALSE);
|
||||
@@ -1653,7 +1660,6 @@ static bool D3D_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_P
|
||||
#endif
|
||||
renderer->LockTexture = D3D_LockTexture;
|
||||
renderer->UnlockTexture = D3D_UnlockTexture;
|
||||
renderer->SetTextureScaleMode = D3D_SetTextureScaleMode;
|
||||
renderer->SetRenderTarget = D3D_SetRenderTarget;
|
||||
renderer->QueueSetViewport = D3D_QueueNoOp;
|
||||
renderer->QueueSetDrawColor = D3D_QueueNoOp;
|
||||
|
||||
Reference in New Issue
Block a user