mirror of
https://github.com/libretro/RetroArch
synced 2025-03-28 19:20:35 +00:00
Reinit textures if pixel format changes in GL.
This commit is contained in:
parent
6d6c170f09
commit
1681741554
36
gfx/gl.c
36
gfx/gl.c
@ -943,6 +943,13 @@ static inline void gl_copy_frame(gl_t *gl, const void *frame, unsigned width, un
|
|||||||
|
|
||||||
static void gl_init_textures(gl_t *gl, const video_info_t *video)
|
static void gl_init_textures(gl_t *gl, const video_info_t *video)
|
||||||
{
|
{
|
||||||
|
if (!gl->pbo)
|
||||||
|
glGenBuffers(1, &gl->pbo);
|
||||||
|
|
||||||
|
glBindBuffer(GL_TEXTURE_REFERENCE_BUFFER_SCE, gl->pbo);
|
||||||
|
glBufferData(GL_TEXTURE_REFERENCE_BUFFER_SCE,
|
||||||
|
gl->tex_w * gl->tex_h * gl->base_size * TEXTURES, NULL, GL_STREAM_DRAW);
|
||||||
|
|
||||||
glGenTextures(TEXTURES, gl->texture);
|
glGenTextures(TEXTURES, gl->texture);
|
||||||
|
|
||||||
for (unsigned i = 0; i < TEXTURES; i++)
|
for (unsigned i = 0; i < TEXTURES; i++)
|
||||||
@ -1243,6 +1250,24 @@ static bool resolve_extensions(gl_t *gl)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef RARCH_CONSOLE
|
||||||
|
static void gl_reinit_textures(gl_t *gl, const video_info_t *video)
|
||||||
|
{
|
||||||
|
unsigned old_base_size = gl->base_size;
|
||||||
|
gl->internal_fmt = video->rgb32 ? RARCH_GL_INTERNAL_FORMAT32 : RARCH_GL_INTERNAL_FORMAT16;
|
||||||
|
gl->texture_type = video->rgb32 ? RARCH_GL_TEXTURE_TYPE32 : RARCH_GL_TEXTURE_TYPE16;
|
||||||
|
gl->texture_fmt = video->rgb32 ? RARCH_GL_FORMAT32 : RARCH_GL_FORMAT16;
|
||||||
|
gl->base_size = video->rgb32 ? sizeof(uint32_t) : sizeof(uint16_t);
|
||||||
|
|
||||||
|
// FIXME: Doesn't handle case if input_scale is larger than what we have from before yet.
|
||||||
|
// In this case, we will have to reinit FBO chain as well.
|
||||||
|
if (old_base_size != gl->base_size)
|
||||||
|
{
|
||||||
|
glDeleteTextures(TEXTURES, gl->texture);
|
||||||
|
gl_init_textures(gl, video);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void *gl_init(const video_info_t *video, const input_driver_t **input, void **input_data)
|
static void *gl_init(const video_info_t *video, const input_driver_t **input, void **input_data)
|
||||||
{
|
{
|
||||||
@ -1252,7 +1277,11 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo
|
|||||||
|
|
||||||
#ifdef RARCH_CONSOLE
|
#ifdef RARCH_CONSOLE
|
||||||
if (driver.video_data)
|
if (driver.video_data)
|
||||||
|
{
|
||||||
|
// Reinitialize textures as we might have changed pixel formats.
|
||||||
|
gl_reinit_textures(gl, video);
|
||||||
return driver.video_data;
|
return driver.video_data;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
gl_t *gl = (gl_t*)calloc(1, sizeof(gl_t));
|
gl_t *gl = (gl_t*)calloc(1, sizeof(gl_t));
|
||||||
@ -1376,13 +1405,6 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo
|
|||||||
gl->tex_w = RARCH_SCALE_BASE * video->input_scale;
|
gl->tex_w = RARCH_SCALE_BASE * video->input_scale;
|
||||||
gl->tex_h = RARCH_SCALE_BASE * video->input_scale;
|
gl->tex_h = RARCH_SCALE_BASE * video->input_scale;
|
||||||
|
|
||||||
#if defined(HAVE_PSGL)
|
|
||||||
glGenBuffers(1, &gl->pbo);
|
|
||||||
glBindBuffer(GL_TEXTURE_REFERENCE_BUFFER_SCE, gl->pbo);
|
|
||||||
glBufferData(GL_TEXTURE_REFERENCE_BUFFER_SCE,
|
|
||||||
gl->tex_w * gl->tex_h * gl->base_size * TEXTURES, NULL, GL_STREAM_DRAW);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Empty buffer that we use to clear out the texture with on res change.
|
// Empty buffer that we use to clear out the texture with on res change.
|
||||||
gl->empty_buf = calloc(sizeof(uint32_t), gl->tex_w * gl->tex_h);
|
gl->empty_buf = calloc(sizeof(uint32_t), gl->tex_w * gl->tex_h);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user