浏览代码

libobs-opengl: Fix border color support on GL textures

jp9000 3 年之前
父节点
当前提交
8ed8301452
共有 3 个文件被更改,包括 16 次插入0 次删除
  1. 6 0
      libobs-opengl/gl-helpers.h
  2. 9 0
      libobs-opengl/gl-subsystem.c
  3. 1 0
      libobs-opengl/gl-subsystem.h

+ 6 - 0
libobs-opengl/gl-helpers.h

@@ -173,6 +173,12 @@ static inline bool gl_tex_param_f(GLenum target, GLenum param, GLfloat val)
 	return gl_success("glTexParameterf");
 }
 
+static inline bool gl_tex_param_fv(GLenum target, GLenum param, GLfloat *val)
+{
+	glTexParameterfv(target, param, val);
+	return gl_success("glTexParameterf");
+}
+
 static inline bool gl_tex_param_i(GLenum target, GLenum param, GLint val)
 {
 	glTexParameteri(target, param, val);

+ 9 - 0
libobs-opengl/gl-subsystem.c

@@ -199,6 +199,8 @@ void convert_sampler_info(struct gs_sampler_state *sampler,
 	else if (sampler->max_anisotropy > max_anisotropy_max)
 		sampler->max_anisotropy = max_anisotropy_max;
 
+	vec4_from_rgba(&sampler->border_color, info->border_color);
+
 	blog(LOG_DEBUG,
 	     "convert_sampler_info: 1 <= max_anisotropy <= "
 	     "%d violated, selected: %d, set: %d",
@@ -473,6 +475,13 @@ static bool load_texture_sampler(gs_texture_t *tex, gs_samplerstate_t *ss)
 		success = false;
 	if (!gl_tex_param_i(tex->gl_target, GL_TEXTURE_WRAP_R, ss->address_w))
 		success = false;
+	if (ss->address_u == GL_CLAMP_TO_BORDER ||
+	    ss->address_v == GL_CLAMP_TO_BORDER ||
+	    ss->address_w == GL_CLAMP_TO_BORDER) {
+		if (!gl_tex_param_fv(tex->gl_target, GL_TEXTURE_BORDER_COLOR,
+				     ss->border_color.ptr))
+			success = false;
+	}
 	if (GLAD_GL_EXT_texture_filter_anisotropic) {
 		if (!gl_tex_param_i(tex->gl_target,
 				    GL_TEXTURE_MAX_ANISOTROPY_EXT,

+ 1 - 0
libobs-opengl/gl-subsystem.h

@@ -419,6 +419,7 @@ struct gs_sampler_state {
 	GLint address_v;
 	GLint address_w;
 	GLint max_anisotropy;
+	struct vec4 border_color;
 };
 
 static inline void samplerstate_addref(gs_samplerstate_t *ss)