Added SDL_SetRenderTextureAddressMode() and SDL_GetRenderTextureAddressMode()

Fixes https://github.com/libsdl-org/SDL/issues/4820
Fixes https://github.com/libsdl-org/SDL/issues/12610
This commit is contained in:
Sam Lantinga
2024-07-20 09:34:34 -07:00
parent eb918af3dc
commit 633b9f6fb1
20 changed files with 623 additions and 531 deletions

View File

@@ -61,7 +61,8 @@ typedef struct
bool beginScene;
bool enableSeparateAlphaBlend;
SDL_ScaleMode scaleMode[3];
SDL_TextureAddressMode addressMode[3];
SDL_TextureAddressMode addressModeU[3];
SDL_TextureAddressMode addressModeV[3];
IDirect3DSurface9 *defaultRenderTarget;
IDirect3DSurface9 *currentRenderTarget;
void *d3dxDLL;
@@ -278,8 +279,11 @@ static void D3D_InitRenderState(D3D_RenderData *data)
}
// Reset our current address mode
for (int i = 0; i < SDL_arraysize(data->addressMode); ++i) {
data->addressMode[i] = SDL_TEXTURE_ADDRESS_INVALID;
for (int i = 0; i < SDL_arraysize(data->addressModeU); ++i) {
data->addressModeU[i] = SDL_TEXTURE_ADDRESS_INVALID;
}
for (int i = 0; i < SDL_arraysize(data->addressModeV); ++i) {
data->addressModeV[i] = SDL_TEXTURE_ADDRESS_INVALID;
}
// Start the render with beginScene
@@ -937,22 +941,28 @@ static void UpdateTextureScaleMode(D3D_RenderData *data, SDL_ScaleMode scaleMode
}
}
static void UpdateTextureAddressMode(D3D_RenderData *data, SDL_TextureAddressMode addressMode, unsigned index)
static DWORD TranslateAddressMode(SDL_TextureAddressMode addressMode)
{
if (addressMode != data->addressMode[index]) {
switch (addressMode) {
case SDL_TEXTURE_ADDRESS_CLAMP:
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
break;
case SDL_TEXTURE_ADDRESS_WRAP:
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
break;
default:
break;
}
data->addressMode[index] = addressMode;
switch (addressMode) {
case SDL_TEXTURE_ADDRESS_CLAMP:
return D3DTADDRESS_CLAMP;
case SDL_TEXTURE_ADDRESS_WRAP:
return D3DTADDRESS_WRAP;
default:
SDL_assert(!"Unknown texture address mode");
return D3DTADDRESS_CLAMP;
}
}
static void UpdateTextureAddressMode(D3D_RenderData *data, SDL_TextureAddressMode addressModeU, SDL_TextureAddressMode addressModeV, unsigned index)
{
if (addressModeU != data->addressModeU[index]) {
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_ADDRESSU, TranslateAddressMode(addressModeU));
data->addressModeU[index] = addressModeU;
}
if (addressModeV != data->addressModeV[index]) {
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_ADDRESSV, TranslateAddressMode(addressModeV));
data->addressModeV[index] = addressModeV;
}
}
@@ -1047,15 +1057,15 @@ static bool SetDrawState(D3D_RenderData *data, const SDL_RenderCommand *cmd)
if (texture) {
UpdateTextureScaleMode(data, cmd->data.draw.texture_scale_mode, 0);
UpdateTextureAddressMode(data, cmd->data.draw.texture_address_mode, 0);
UpdateTextureAddressMode(data, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v, 0);
#ifdef SDL_HAVE_YUV
D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
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);
UpdateTextureAddressMode(data, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v, 1);
UpdateTextureAddressMode(data, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v, 2);
}
#endif // SDL_HAVE_YUV
}