From 69c45ce71c5a600f0372746348875a626e06898b Mon Sep 17 00:00:00 2001
From: bunnei <bunneidev@gmail.com>
Date: Mon, 23 Jul 2018 23:26:48 -0400
Subject: [PATCH] gl_rasterizer: Implement texture border color.

---
 src/video_core/renderer_opengl/gl_rasterizer.cpp | 9 ++++++---
 src/video_core/renderer_opengl/gl_rasterizer.h   | 5 +----
 src/video_core/textures/texture.h                | 8 ++++----
 3 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 56d9c575ba..5d5ad84b7d 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -601,7 +601,6 @@ void RasterizerOpenGL::SamplerInfo::Create() {
     sampler.Create();
     mag_filter = min_filter = Tegra::Texture::TextureFilter::Linear;
     wrap_u = wrap_v = Tegra::Texture::WrapMode::Wrap;
-    border_color_r = border_color_g = border_color_b = border_color_a = 0;
 
     // default is GL_LINEAR_MIPMAP_LINEAR
     glSamplerParameteri(sampler.handle, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
@@ -630,8 +629,12 @@ void RasterizerOpenGL::SamplerInfo::SyncWithConfig(const Tegra::Texture::TSCEntr
     }
 
     if (wrap_u == Tegra::Texture::WrapMode::Border || wrap_v == Tegra::Texture::WrapMode::Border) {
-        // TODO(Subv): Implement border color
-        ASSERT(false);
+        const GLvec4 new_border_color = {{config.border_color_r, config.border_color_g,
+                                          config.border_color_b, config.border_color_a}};
+        if (border_color != new_border_color) {
+            border_color = new_border_color;
+            glSamplerParameterfv(s, GL_TEXTURE_BORDER_COLOR, border_color.data());
+        }
     }
 }
 
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index c406142e49..ab06e2d959 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -77,10 +77,7 @@ private:
         Tegra::Texture::TextureFilter min_filter;
         Tegra::Texture::WrapMode wrap_u;
         Tegra::Texture::WrapMode wrap_v;
-        u32 border_color_r;
-        u32 border_color_g;
-        u32 border_color_b;
-        u32 border_color_a;
+        GLvec4 border_color;
     };
 
     /// Configures the color and depth framebuffer states and returns the dirty <Color, Depth>
diff --git a/src/video_core/textures/texture.h b/src/video_core/textures/texture.h
index d1c755033e..c6bd2f4b9d 100644
--- a/src/video_core/textures/texture.h
+++ b/src/video_core/textures/texture.h
@@ -242,10 +242,10 @@ struct TSCEntry {
         BitField<6, 2, TextureMipmapFilter> mip_filter;
     };
     INSERT_PADDING_BYTES(8);
-    u32 border_color_r;
-    u32 border_color_g;
-    u32 border_color_b;
-    u32 border_color_a;
+    float border_color_r;
+    float border_color_g;
+    float border_color_b;
+    float border_color_a;
 };
 static_assert(sizeof(TSCEntry) == 0x20, "TSCEntry has wrong size");
 
-- 
GitLab