mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-09-06 03:18:13 +00:00
Set the texture scale and address mode when creating a texture
Fixes https://github.com/libsdl-org/sdl2-compat/issues/506
(cherry picked from commit ef19c72015
)
This commit is contained in:
@@ -439,6 +439,40 @@ static bool convert_format(Uint32 pixel_format, GLint *internalFormat, GLenum *f
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool SetTextureScaleMode(GL_RenderData *data, GLenum textype, SDL_ScaleMode scaleMode)
|
||||||
|
{
|
||||||
|
switch (scaleMode) {
|
||||||
|
case SDL_SCALEMODE_NEAREST:
|
||||||
|
data->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
data->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
|
break;
|
||||||
|
case SDL_SCALEMODE_LINEAR:
|
||||||
|
data->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
data->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return SDL_SetError("Unknown texture scale mode: %d", scaleMode);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool SetTextureAddressMode(GL_RenderData *data, GLenum textype, SDL_TextureAddressMode addressMode)
|
||||||
|
{
|
||||||
|
switch (addressMode) {
|
||||||
|
case SDL_TEXTURE_ADDRESS_CLAMP:
|
||||||
|
data->glTexParameteri(textype, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
|
data->glTexParameteri(textype, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
break;
|
||||||
|
case SDL_TEXTURE_ADDRESS_WRAP:
|
||||||
|
data->glTexParameteri(textype, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||||
|
data->glTexParameteri(textype, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return SDL_SetError("Unknown texture address mode: %d", addressMode);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool GL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_PropertiesID create_props)
|
static bool GL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_PropertiesID create_props)
|
||||||
{
|
{
|
||||||
GL_RenderData *renderdata = (GL_RenderData *)renderer->internal;
|
GL_RenderData *renderdata = (GL_RenderData *)renderer->internal;
|
||||||
@@ -535,10 +569,12 @@ static bool GL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_P
|
|||||||
|
|
||||||
data->format = format;
|
data->format = format;
|
||||||
data->formattype = type;
|
data->formattype = type;
|
||||||
data->texture_scale_mode = SDL_SCALEMODE_INVALID;
|
data->texture_scale_mode = texture->scaleMode;
|
||||||
data->texture_address_mode = SDL_TEXTURE_ADDRESS_INVALID;
|
data->texture_address_mode = SDL_TEXTURE_ADDRESS_CLAMP;
|
||||||
renderdata->glEnable(textype);
|
renderdata->glEnable(textype);
|
||||||
renderdata->glBindTexture(textype, data->texture);
|
renderdata->glBindTexture(textype, data->texture);
|
||||||
|
SetTextureScaleMode(renderdata, textype, data->texture_scale_mode);
|
||||||
|
SetTextureAddressMode(renderdata, textype, data->texture_address_mode);
|
||||||
#ifdef SDL_PLATFORM_MACOS
|
#ifdef SDL_PLATFORM_MACOS
|
||||||
#ifndef GL_TEXTURE_STORAGE_HINT_APPLE
|
#ifndef GL_TEXTURE_STORAGE_HINT_APPLE
|
||||||
#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC
|
#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC
|
||||||
@@ -570,10 +606,11 @@ static bool GL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_P
|
|||||||
renderdata->glTexImage2D(textype, 0, internalFormat, texture_w,
|
renderdata->glTexImage2D(textype, 0, internalFormat, texture_w,
|
||||||
texture_h, 0, format, type, NULL);
|
texture_h, 0, format, type, NULL);
|
||||||
}
|
}
|
||||||
renderdata->glDisable(textype);
|
|
||||||
if (!GL_CheckError("glTexImage2D()", renderer)) {
|
if (!GL_CheckError("glTexImage2D()", renderer)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
SetTextureScaleMode(renderdata, textype, data->texture_scale_mode);
|
||||||
|
SetTextureAddressMode(renderdata, textype, data->texture_address_mode);
|
||||||
|
|
||||||
#ifdef SDL_HAVE_YUV
|
#ifdef SDL_HAVE_YUV
|
||||||
if (texture->format == SDL_PIXELFORMAT_YV12 ||
|
if (texture->format == SDL_PIXELFORMAT_YV12 ||
|
||||||
@@ -596,11 +633,15 @@ static bool GL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_P
|
|||||||
renderdata->glBindTexture(textype, data->utexture);
|
renderdata->glBindTexture(textype, data->utexture);
|
||||||
renderdata->glTexImage2D(textype, 0, internalFormat, (texture_w + 1) / 2,
|
renderdata->glTexImage2D(textype, 0, internalFormat, (texture_w + 1) / 2,
|
||||||
(texture_h + 1) / 2, 0, format, type, NULL);
|
(texture_h + 1) / 2, 0, format, type, NULL);
|
||||||
|
SetTextureScaleMode(renderdata, textype, data->texture_scale_mode);
|
||||||
|
SetTextureAddressMode(renderdata, textype, data->texture_address_mode);
|
||||||
SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_OPENGL_TEXTURE_U_NUMBER, data->utexture);
|
SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_OPENGL_TEXTURE_U_NUMBER, data->utexture);
|
||||||
|
|
||||||
renderdata->glBindTexture(textype, data->vtexture);
|
renderdata->glBindTexture(textype, data->vtexture);
|
||||||
renderdata->glTexImage2D(textype, 0, internalFormat, (texture_w + 1) / 2,
|
renderdata->glTexImage2D(textype, 0, internalFormat, (texture_w + 1) / 2,
|
||||||
(texture_h + 1) / 2, 0, format, type, NULL);
|
(texture_h + 1) / 2, 0, format, type, NULL);
|
||||||
|
SetTextureScaleMode(renderdata, textype, data->texture_scale_mode);
|
||||||
|
SetTextureAddressMode(renderdata, textype, data->texture_address_mode);
|
||||||
SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_OPENGL_TEXTURE_V_NUMBER, data->vtexture);
|
SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_OPENGL_TEXTURE_V_NUMBER, data->vtexture);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -617,6 +658,8 @@ static bool GL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_P
|
|||||||
renderdata->glBindTexture(textype, data->utexture);
|
renderdata->glBindTexture(textype, data->utexture);
|
||||||
renderdata->glTexImage2D(textype, 0, GL_LUMINANCE_ALPHA, (texture_w + 1) / 2,
|
renderdata->glTexImage2D(textype, 0, GL_LUMINANCE_ALPHA, (texture_w + 1) / 2,
|
||||||
(texture_h + 1) / 2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);
|
(texture_h + 1) / 2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);
|
||||||
|
SetTextureScaleMode(renderdata, textype, data->texture_scale_mode);
|
||||||
|
SetTextureAddressMode(renderdata, textype, data->texture_address_mode);
|
||||||
SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_OPENGL_TEXTURE_UV_NUMBER, data->utexture);
|
SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_OPENGL_TEXTURE_UV_NUMBER, data->utexture);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -651,6 +694,8 @@ static bool GL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_P
|
|||||||
}
|
}
|
||||||
#endif // SDL_HAVE_YUV
|
#endif // SDL_HAVE_YUV
|
||||||
|
|
||||||
|
renderdata->glDisable(textype);
|
||||||
|
|
||||||
return GL_CheckError("", renderer);
|
return GL_CheckError("", renderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1074,40 +1119,6 @@ static bool SetDrawState(GL_RenderData *data, const SDL_RenderCommand *cmd, cons
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool SetTextureScaleMode(GL_RenderData *data, GLenum textype, SDL_ScaleMode scaleMode)
|
|
||||||
{
|
|
||||||
switch (scaleMode) {
|
|
||||||
case SDL_SCALEMODE_NEAREST:
|
|
||||||
data->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
||||||
data->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
||||||
break;
|
|
||||||
case SDL_SCALEMODE_LINEAR:
|
|
||||||
data->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
||||||
data->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return SDL_SetError("Unknown texture scale mode: %d", scaleMode);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool SetTextureAddressMode(GL_RenderData *data, GLenum textype, SDL_TextureAddressMode addressMode)
|
|
||||||
{
|
|
||||||
switch (addressMode) {
|
|
||||||
case SDL_TEXTURE_ADDRESS_CLAMP:
|
|
||||||
data->glTexParameteri(textype, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
||||||
data->glTexParameteri(textype, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
||||||
break;
|
|
||||||
case SDL_TEXTURE_ADDRESS_WRAP:
|
|
||||||
data->glTexParameteri(textype, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
|
||||||
data->glTexParameteri(textype, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return SDL_SetError("Unknown texture address mode: %d", addressMode);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool SetCopyState(GL_RenderData *data, const SDL_RenderCommand *cmd)
|
static bool SetCopyState(GL_RenderData *data, const SDL_RenderCommand *cmd)
|
||||||
{
|
{
|
||||||
SDL_Texture *texture = cmd->data.draw.texture;
|
SDL_Texture *texture = cmd->data.draw.texture;
|
||||||
|
@@ -1616,8 +1616,8 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
|||||||
data->texture_u = 0;
|
data->texture_u = 0;
|
||||||
data->texture_v = 0;
|
data->texture_v = 0;
|
||||||
#endif
|
#endif
|
||||||
data->texture_scale_mode = SDL_SCALEMODE_INVALID;
|
data->texture_scale_mode = texture->scaleMode;
|
||||||
data->texture_address_mode = SDL_TEXTURE_ADDRESS_INVALID;
|
data->texture_address_mode = SDL_TEXTURE_ADDRESS_CLAMP;
|
||||||
|
|
||||||
// Allocate a blob for image renderdata
|
// Allocate a blob for image renderdata
|
||||||
if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
|
if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
|
||||||
@@ -1659,6 +1659,13 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
|||||||
renderdata->glActiveTexture(GL_TEXTURE2);
|
renderdata->glActiveTexture(GL_TEXTURE2);
|
||||||
renderdata->glBindTexture(data->texture_type, data->texture_v);
|
renderdata->glBindTexture(data->texture_type, data->texture_v);
|
||||||
renderdata->glTexImage2D(data->texture_type, 0, format, (texture->w + 1) / 2, (texture->h + 1) / 2, 0, format, type, NULL);
|
renderdata->glTexImage2D(data->texture_type, 0, format, (texture->w + 1) / 2, (texture->h + 1) / 2, 0, format, type, NULL);
|
||||||
|
if (!GL_CheckError("glTexImage2D()", renderer)) {
|
||||||
|
SDL_free(data->pixel_data);
|
||||||
|
SDL_free(data);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
SetTextureScaleMode(renderdata, data->texture_type, data->texture_scale_mode);
|
||||||
|
SetTextureAddressMode(renderdata, data->texture_type, data->texture_address_mode);
|
||||||
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_V_NUMBER, data->texture_v);
|
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_V_NUMBER, data->texture_v);
|
||||||
|
|
||||||
data->texture_u = (GLuint)SDL_GetNumberProperty(create_props, SDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_U_NUMBER, 0);
|
data->texture_u = (GLuint)SDL_GetNumberProperty(create_props, SDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_U_NUMBER, 0);
|
||||||
@@ -1680,6 +1687,8 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
|||||||
SDL_free(data);
|
SDL_free(data);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
SetTextureScaleMode(renderdata, data->texture_type, data->texture_scale_mode);
|
||||||
|
SetTextureAddressMode(renderdata, data->texture_type, data->texture_address_mode);
|
||||||
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_U_NUMBER, data->texture_u);
|
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_U_NUMBER, data->texture_u);
|
||||||
|
|
||||||
if (!SDL_GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, 8)) {
|
if (!SDL_GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, 8)) {
|
||||||
@@ -1707,6 +1716,8 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
|||||||
SDL_free(data);
|
SDL_free(data);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
SetTextureScaleMode(renderdata, data->texture_type, data->texture_scale_mode);
|
||||||
|
SetTextureAddressMode(renderdata, data->texture_type, data->texture_address_mode);
|
||||||
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_UV_NUMBER, data->texture_u);
|
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_UV_NUMBER, data->texture_u);
|
||||||
|
|
||||||
if (!SDL_GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, 8)) {
|
if (!SDL_GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, 8)) {
|
||||||
@@ -1737,6 +1748,8 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
SetTextureScaleMode(renderdata, data->texture_type, data->texture_scale_mode);
|
||||||
|
SetTextureAddressMode(renderdata, data->texture_type, data->texture_address_mode);
|
||||||
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_NUMBER, data->texture);
|
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_NUMBER, data->texture);
|
||||||
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_TARGET_NUMBER, data->texture_type);
|
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_TARGET_NUMBER, data->texture_type);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user