[Bf-blender-cvs] [5b4a862f834] master: GPUTexture: Add better swizzle support

Clément Foucault noreply at git.blender.org
Sat Jul 18 03:08:15 CEST 2020


Commit: 5b4a862f834eef798762660a73c6ae9881368460
Author: Clément Foucault
Date:   Fri Jul 17 02:15:41 2020 +0200
Branches: master
https://developer.blender.org/rB5b4a862f834eef798762660a73c6ae9881368460

GPUTexture: Add better swizzle support

===================================================================

M	source/blender/draw/intern/draw_cache_impl_volume.c
M	source/blender/gpu/GPU_texture.h
M	source/blender/gpu/intern/gpu_draw_smoke.c
M	source/blender/gpu/intern/gpu_texture.c

===================================================================

diff --git a/source/blender/draw/intern/draw_cache_impl_volume.c b/source/blender/draw/intern/draw_cache_impl_volume.c
index 9c2c075ab4f..e07f5b33d58 100644
--- a/source/blender/draw/intern/draw_cache_impl_volume.c
+++ b/source/blender/draw/intern/draw_cache_impl_volume.c
@@ -266,7 +266,7 @@ static DRWVolumeGrid *volume_grid_cache_get(Volume *volume,
                                                 NULL);
 
     GPU_texture_bind(cache_grid->texture, 0);
-    GPU_texture_swizzle_channel_auto(cache_grid->texture, channels);
+    GPU_texture_swizzle_set(cache_grid->texture, (channels == 3) ? "rgb1" : "rrr1");
     GPU_texture_wrap_mode(cache_grid->texture, false, false);
     GPU_texture_unbind(cache_grid->texture);
 
diff --git a/source/blender/gpu/GPU_texture.h b/source/blender/gpu/GPU_texture.h
index f9e129b2f7a..9c7cc6b5e32 100644
--- a/source/blender/gpu/GPU_texture.h
+++ b/source/blender/gpu/GPU_texture.h
@@ -275,7 +275,7 @@ void GPU_texture_wrap_mode(GPUTexture *tex, bool use_repeat, bool use_clamp);
 void GPU_texture_filters(GPUTexture *tex,
                          eGPUFilterFunction min_filter,
                          eGPUFilterFunction mag_filter);
-void GPU_texture_swizzle_channel_auto(GPUTexture *tex, int channels);
+void GPU_texture_swizzle_set(GPUTexture *tex, const char swizzle[4]);
 
 void GPU_texture_attach_framebuffer(GPUTexture *tex, struct GPUFrameBuffer *fb, int attachment);
 int GPU_texture_detach_framebuffer(GPUTexture *tex, struct GPUFrameBuffer *fb);
diff --git a/source/blender/gpu/intern/gpu_draw_smoke.c b/source/blender/gpu/intern/gpu_draw_smoke.c
index 79b3861d339..89261afaebd 100644
--- a/source/blender/gpu/intern/gpu_draw_smoke.c
+++ b/source/blender/gpu/intern/gpu_draw_smoke.c
@@ -128,7 +128,7 @@ static void swizzle_texture_channel_single(GPUTexture *tex)
   /* Swizzle texture channels so that we get useful RGBA values when sampling
    * a texture with fewer channels, e.g. when using density as color. */
   GPU_texture_bind(tex, 0);
-  GPU_texture_swizzle_channel_auto(tex, 1);
+  GPU_texture_swizzle_set(tex, "rrr1");
   GPU_texture_unbind(tex);
 }
 
diff --git a/source/blender/gpu/intern/gpu_texture.c b/source/blender/gpu/intern/gpu_texture.c
index 251a4d71597..c4d7eccf9f9 100644
--- a/source/blender/gpu/intern/gpu_texture.c
+++ b/source/blender/gpu/intern/gpu_texture.c
@@ -1962,15 +1962,40 @@ void GPU_texture_wrap_mode(GPUTexture *tex, bool use_repeat, bool use_clamp)
   SET_FLAG_FROM_TEST(tex->sampler_state, !use_clamp, GPU_SAMPLER_CLAMP_BORDER);
 }
 
-void GPU_texture_swizzle_channel_auto(GPUTexture *tex, int channels)
+static int gpu_texture_swizzle_to_enum(const char swizzle)
+{
+  switch (swizzle) {
+    case 'w':
+    case 'a':
+      return GL_ALPHA;
+    case 'z':
+    case 'b':
+      return GL_BLUE;
+    case 'y':
+    case 'g':
+      return GL_GREEN;
+    case '0':
+      return GL_ZERO;
+    case '1':
+      return GL_ONE;
+    case 'x':
+    case 'r':
+    default:
+      return GL_RED;
+  }
+}
+
+void GPU_texture_swizzle_set(GPUTexture *tex, const char swizzle[4])
 {
   WARN_NOT_BOUND(tex);
 
+  GLint gl_swizzle[4] = {gpu_texture_swizzle_to_enum(swizzle[0]),
+                         gpu_texture_swizzle_to_enum(swizzle[1]),
+                         gpu_texture_swizzle_to_enum(swizzle[2]),
+                         gpu_texture_swizzle_to_enum(swizzle[3])};
+
   glActiveTexture(GL_TEXTURE0 + tex->number);
-  glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_R, GL_RED);
-  glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_G, (channels >= 2) ? GL_GREEN : GL_RED);
-  glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_B, (channels >= 3) ? GL_BLUE : GL_RED);
-  glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_A, (channels >= 4) ? GL_ALPHA : GL_ONE);
+  glTexParameteriv(tex->target_base, GL_TEXTURE_SWIZZLE_RGBA, gl_swizzle);
 }
 
 void GPU_texture_free(GPUTexture *tex)



More information about the Bf-blender-cvs mailing list