0
0
mirror of https://github.com/obsproject/obs-studio.git synced 2024-09-20 04:42:18 +02:00

OpenGL: Use texture swizzle for BGRA/BGR/A8

On some operating systems, with specific drivers it seems that BGR/BGRA
isn't properly treated as such in certain cases.  This fix will
hopefully force the formats to be treated as BGR/BGRA when actually
rendering, which should get around the implementation-specific issue.
This commit is contained in:
jp9000 2014-04-11 13:14:20 -07:00
parent f98c006711
commit 362e008b87
2 changed files with 29 additions and 1 deletions

View File

@ -311,9 +311,28 @@ static void strip_mipmap_filter(GLint *filter)
*filter = GL_NEAREST;
}
static inline void apply_swizzle(struct gs_texture *tex)
{
if (tex->format == GS_A8) {
gl_tex_param_i(tex->gl_target, GL_TEXTURE_SWIZZLE_R, GL_ALPHA);
} else {
#ifdef USE_FORMAT_SWIZZLE
bool invert_format =
(tex->format == GS_BGRA || tex->format == GS_BGRX);
gl_tex_param_i(tex->gl_target, GL_TEXTURE_SWIZZLE_R,
invert_format ? GL_BLUE : GL_RED);
gl_tex_param_i(tex->gl_target, GL_TEXTURE_SWIZZLE_B,
invert_format ? GL_RED : GL_BLUE);
#else
gl_tex_param_i(tex->gl_target, GL_TEXTURE_SWIZZLE_R, GL_RED);
#endif
}
}
static bool load_texture_sampler(texture_t tex, samplerstate_t ss)
{
bool success = true;
bool success = true;
GLint min_filter;
if (tex->cur_sampler == ss)
@ -347,6 +366,8 @@ static bool load_texture_sampler(texture_t tex, samplerstate_t ss)
ss->max_anisotropy))
success = false;
apply_swizzle(tex);
return success;
}

View File

@ -27,6 +27,8 @@
#include "gl-helpers.h"
#define USE_FORMAT_SWIZZLE
struct gl_platform;
struct gl_windowinfo;
@ -42,8 +44,13 @@ static inline GLint convert_gs_format(enum gs_color_format format)
case GS_A8: return GL_RGBA;
case GS_R8: return GL_RED;
case GS_RGBA: return GL_RGBA;
#ifdef USE_FORMAT_SWIZZLE
case GS_BGRX: return GL_RGB;
case GS_BGRA: return GL_RGBA;
#else
case GS_BGRX: return GL_BGR;
case GS_BGRA: return GL_BGRA;
#endif
case GS_R10G10B10A2: return GL_RGBA;
case GS_RGBA16: return GL_RGBA;
case GS_R16: return GL_RED;