fix: Mejorar obtención de texture ID en OpenGL ES

- Probar SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_NUMBER para ES
- Probar SDL_PROP_TEXTURE_OPENGL_TEXTURE_NUMBER para Desktop
- Añadir logs detallados para debug
- No intentar bind si texture_id es 0 (prevenir GL_INVALID_ENUM)

Refs: Error 0x500 en glBindTexture en RPi
This commit is contained in:
2025-10-02 21:55:49 +02:00
parent 29e76b1ddd
commit ba0b0930b0

View File

@@ -189,29 +189,34 @@ void OpenGLShader::createQuadGeometry() {
} }
GLuint OpenGLShader::getTextureID(SDL_Texture* texture) { GLuint OpenGLShader::getTextureID(SDL_Texture* texture) {
if (!texture) return 1; if (!texture) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "texture es nullptr");
return 0;
}
SDL_PropertiesID props = SDL_GetTextureProperties(texture); SDL_PropertiesID props = SDL_GetTextureProperties(texture);
GLuint texture_id = 0; GLuint texture_id = 0;
// Intentar obtener ID de textura OpenGL // Probar diferentes nombres de properties (Desktop vs ES)
texture_id = (GLuint)(uintptr_t)SDL_GetPointerProperty(props, "SDL.texture.opengl.texture", nullptr); const char* property_names[] = {
SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_NUMBER, // OpenGL ES
SDL_PROP_TEXTURE_OPENGL_TEXTURE_NUMBER, // OpenGL Desktop
"SDL.texture.opengl.texture", // Fallback legacy
"texture.opengl.texture" // Fallback legacy
};
if (texture_id == 0) { for (const char* prop_name : property_names) {
texture_id = (GLuint)(uintptr_t)SDL_GetPointerProperty(props, "texture.opengl.texture", nullptr); texture_id = (GLuint)SDL_GetNumberProperty(props, prop_name, 0);
if (texture_id != 0) {
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
"Textura OpenGL obtenida via '%s': ID=%u", prop_name, texture_id);
return texture_id;
}
} }
if (texture_id == 0) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
texture_id = (GLuint)SDL_GetNumberProperty(props, "SDL.texture.opengl.texture", 1); "No se pudo obtener ID de textura OpenGL con ninguna property");
} return 0;
if (texture_id == 0) {
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
"No se pudo obtener ID de textura OpenGL, usando 1 por defecto");
texture_id = 1;
}
return texture_id;
} }
bool OpenGLShader::init(SDL_Window* window, bool OpenGLShader::init(SDL_Window* window,
@@ -345,6 +350,15 @@ void OpenGLShader::render() {
// Obtener y bindear textura // Obtener y bindear textura
GLuint texture_id = getTextureID(back_buffer_); GLuint texture_id = getTextureID(back_buffer_);
if (texture_id == 0) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"No se pudo obtener texture_id, abortando render");
// Restaurar estados y hacer fallback
SDL_RenderTexture(renderer_, back_buffer_, nullptr, nullptr);
SDL_RenderPresent(renderer_);
return;
}
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture_id); glBindTexture(GL_TEXTURE_2D, texture_id);
checkGLError("glBindTexture"); checkGLError("glBindTexture");