[Bf-blender-cvs] [e7496437938] master: GPU: Refactor gpu_texture_image to not use GL calls

Clément Foucault noreply at git.blender.org
Wed Jul 29 15:03:12 CEST 2020


Commit: e749643793809248dfc6ffd078be04aec3eeab82
Author: Clément Foucault
Date:   Wed Jul 29 04:55:21 2020 +0200
Branches: master
https://developer.blender.org/rBe749643793809248dfc6ffd078be04aec3eeab82

GPU: Refactor gpu_texture_image to not use GL calls

This is also a bit of code cleanup, reorganisation.

Tried to be DRYed but avoid too much code change to (hopefully) minimize
breakage.

- GPU: remove TEXTARGET_CUBE_MAP, this is no longer used in the codebase.
- GPUTexture: Move compressed texture upload to gpu_texture.cc
- GPUTexture: Add per texture Anisotropic filtering switch

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

M	source/blender/gpu/GPU_draw.h
M	source/blender/gpu/GPU_texture.h
M	source/blender/gpu/intern/gpu_texture.cc
M	source/blender/gpu/intern/gpu_texture_image.cc
M	source/blender/gpu/intern/gpu_texture_smoke.cc
M	source/blender/makesdna/DNA_image_types.h
M	source/blender/makesdna/DNA_movieclip_types.h
M	source/blender/makesrna/intern/rna_userdef.c
M	source/blender/nodes/shader/nodes/node_shader_tex_environment.c
M	source/blender/nodes/shader/nodes/node_shader_tex_image.c
M	source/blender/windowmanager/intern/wm_init_exit.c

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

diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h
index 01af654b52f..8110920527d 100644
--- a/source/blender/gpu/GPU_draw.h
+++ b/source/blender/gpu/GPU_draw.h
@@ -42,23 +42,13 @@ struct Main;
 /* Mipmap settings
  * - these will free textures on changes */
 
-void GPU_set_mipmap(struct Main *bmain, bool mipmap);
-bool GPU_get_mipmap(void);
-void GPU_set_linear_mipmap(bool linear);
-bool GPU_get_linear_mipmap(void);
 void GPU_paint_set_mipmap(struct Main *bmain, bool mipmap);
 
-/* Anisotropic filtering settings
- * - these will free textures on changes */
-void GPU_set_anisotropic(float value);
-float GPU_get_anisotropic(void);
-
 /* Image updates and free
  * - these deal with images bound as opengl textures */
 
 void GPU_paint_update_image(
     struct Image *ima, struct ImageUser *iuser, int x, int y, int w, int h);
-bool GPU_upload_dxt_texture(struct ImBuf *ibuf, bool use_srgb, uint *bindcode);
 void GPU_free_image(struct Image *ima);
 void GPU_free_images(struct Main *bmain);
 void GPU_free_images_anim(struct Main *bmain);
diff --git a/source/blender/gpu/GPU_texture.h b/source/blender/gpu/GPU_texture.h
index 6685e2a2171..42afe2b63bf 100644
--- a/source/blender/gpu/GPU_texture.h
+++ b/source/blender/gpu/GPU_texture.h
@@ -41,7 +41,6 @@ typedef struct GPUTexture GPUTexture;
 /* Used to get the correct gpu texture from an Image datablock. */
 typedef enum eGPUTextureTarget {
   TEXTARGET_2D = 0,
-  TEXTARGET_CUBE_MAP,
   TEXTARGET_2D_ARRAY,
   TEXTARGET_TILE_MAPPING,
   TEXTARGET_COUNT,
@@ -131,7 +130,6 @@ typedef enum eGPUTextureFormat {
 #if 0
   GPU_RGB10_A2,
   GPU_RGB10_A2UI,
-  GPU_SRGB8_A8,
 #endif
   GPU_R11F_G11F_B10F,
   GPU_DEPTH32F_STENCIL8,
@@ -160,7 +158,13 @@ typedef enum eGPUTextureFormat {
   GPU_R8_SNORM,
 #endif
 
-/* Special formats texture only */
+  /* Special formats texture only */
+  GPU_SRGB8_A8_DXT1,
+  GPU_SRGB8_A8_DXT3,
+  GPU_SRGB8_A8_DXT5,
+  GPU_RGBA8_DXT1,
+  GPU_RGBA8_DXT3,
+  GPU_RGBA8_DXT5,
 #if 0
   GPU_SRGB8,
   GPU_RGB9_E5,
@@ -233,7 +237,10 @@ GPUTexture *GPU_texture_create_cube_array(
 GPUTexture *GPU_texture_create_from_vertbuf(struct GPUVertBuf *vert);
 GPUTexture *GPU_texture_create_buffer(eGPUTextureFormat data_type, const uint buffer);
 
-GPUTexture *GPU_texture_from_bindcode(eGPUTextureTarget target, int bindcode);
+GPUTexture *GPU_texture_create_error(eGPUTextureTarget target);
+GPUTexture *GPU_texture_create_compressed(
+    int w, int h, int miplen, eGPUTextureFormat format, const void *data);
+
 GPUTexture *GPU_texture_from_blender(struct Image *ima,
                                      struct ImageUser *iuser,
                                      struct ImBuf *ibuf,
@@ -279,6 +286,7 @@ void GPU_texture_unbind_all(void);
 void GPU_texture_copy(GPUTexture *dst, GPUTexture *src);
 
 void GPU_texture_generate_mipmap(GPUTexture *tex);
+void GPU_texture_anisotropic_filter(GPUTexture *tex, bool use_aniso);
 void GPU_texture_compare_mode(GPUTexture *tex, bool use_compare);
 void GPU_texture_filter_mode(GPUTexture *tex, bool use_filter);
 void GPU_texture_mipmap_mode(GPUTexture *tex, bool use_mipmap, bool use_filter);
diff --git a/source/blender/gpu/intern/gpu_texture.cc b/source/blender/gpu/intern/gpu_texture.cc
index 2afba122cfd..db9d961e2e3 100644
--- a/source/blender/gpu/intern/gpu_texture.cc
+++ b/source/blender/gpu/intern/gpu_texture.cc
@@ -26,6 +26,7 @@
 #include "MEM_guardedalloc.h"
 
 #include "DNA_image_types.h"
+#include "DNA_userdef_types.h"
 
 #include "BLI_blenlib.h"
 #include "BLI_math_base.h"
@@ -439,6 +440,13 @@ static uint gpu_get_bytesize(eGPUTextureFormat data_type)
     case GPU_R8:
     case GPU_R8UI:
       return 1;
+    case GPU_SRGB8_A8_DXT1:
+    case GPU_SRGB8_A8_DXT3:
+    case GPU_SRGB8_A8_DXT5:
+    case GPU_RGBA8_DXT1:
+    case GPU_RGBA8_DXT3:
+    case GPU_RGBA8_DXT5:
+      return 1; /* Incorrect but actual size is fractional. */
     default:
       BLI_assert(!"Texture format incorrect or unsupported\n");
       return 0;
@@ -524,7 +532,18 @@ static GLenum gpu_format_to_gl_internalformat(eGPUTextureFormat format)
     case GPU_RGB16F:
       return GL_RGB16F;
     /* Special formats texture only */
-    /* ** Add Format here */
+    case GPU_SRGB8_A8_DXT1:
+      return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
+    case GPU_SRGB8_A8_DXT3:
+      return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
+    case GPU_SRGB8_A8_DXT5:
+      return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
+    case GPU_RGBA8_DXT1:
+      return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
+    case GPU_RGBA8_DXT3:
+      return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
+    case GPU_RGBA8_DXT5:
+      return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
     /* Depth Formats */
     case GPU_DEPTH_COMPONENT32F:
       return GL_DEPTH_COMPONENT32F;
@@ -538,99 +557,6 @@ static GLenum gpu_format_to_gl_internalformat(eGPUTextureFormat format)
   }
 }
 
-static eGPUTextureFormat gl_internalformat_to_gpu_format(const GLint glformat)
-{
-  /* You can add any of the available type to this list
-   * For available types see GPU_texture.h */
-  switch (glformat) {
-    /* Formats texture & renderbuffer */
-    case GL_RGBA8UI:
-      return GPU_RGBA8UI;
-    case GL_RGBA8I:
-      return GPU_RGBA8I;
-    case GL_RGBA8:
-      return GPU_RGBA8;
-    case GL_RGBA32UI:
-      return GPU_RGBA32UI;
-    case GL_RGBA32I:
-      return GPU_RGBA32I;
-    case GL_RGBA32F:
-      return GPU_RGBA32F;
-    case GL_RGBA16UI:
-      return GPU_RGBA16UI;
-    case GL_RGBA16I:
-      return GPU_RGBA16I;
-    case GL_RGBA16F:
-      return GPU_RGBA16F;
-    case GL_RGBA16:
-      return GPU_RGBA16;
-    case GL_RG8UI:
-      return GPU_RG8UI;
-    case GL_RG8I:
-      return GPU_RG8I;
-    case GL_RG8:
-      return GPU_RG8;
-    case GL_RG32UI:
-      return GPU_RG32UI;
-    case GL_RG32I:
-      return GPU_RG32I;
-    case GL_RG32F:
-      return GPU_RG32F;
-    case GL_RG16UI:
-      return GPU_RG16UI;
-    case GL_RG16I:
-      return GPU_RG16I;
-    case GL_RG16F:
-      return GPU_RGBA32F;
-    case GL_RG16:
-      return GPU_RG16;
-    case GL_R8UI:
-      return GPU_R8UI;
-    case GL_R8I:
-      return GPU_R8I;
-    case GL_R8:
-      return GPU_R8;
-    case GL_R32UI:
-      return GPU_R32UI;
-    case GL_R32I:
-      return GPU_R32I;
-    case GL_R32F:
-      return GPU_R32F;
-    case GL_R16UI:
-      return GPU_R16UI;
-    case GL_R16I:
-      return GPU_R16I;
-    case GL_R16F:
-      return GPU_R16F;
-    case GL_R16:
-      return GPU_R16;
-    /* Special formats texture & renderbuffer */
-    case GL_R11F_G11F_B10F:
-      return GPU_R11F_G11F_B10F;
-    case GL_DEPTH32F_STENCIL8:
-      return GPU_DEPTH32F_STENCIL8;
-    case GL_DEPTH24_STENCIL8:
-      return GPU_DEPTH24_STENCIL8;
-    case GL_SRGB8_ALPHA8:
-      return GPU_SRGB8_A8;
-    /* Texture only format */
-    case GL_RGB16F:
-      return GPU_RGB16F;
-    /* Special formats texture only */
-    /* ** Add Format here */
-    /* Depth Formats */
-    case GL_DEPTH_COMPONENT32F:
-      return GPU_DEPTH_COMPONENT32F;
-    case GL_DEPTH_COMPONENT24:
-      return GPU_DEPTH_COMPONENT24;
-    case GL_DEPTH_COMPONENT16:
-      return GPU_DEPTH_COMPONENT16;
-    default:
-      BLI_assert(!"Internal format incorrect or unsupported\n");
-      return GPU_RGBA8;
-  }
-}
-
 static GLenum gpu_get_gl_datatype(eGPUDataFormat format)
 {
   switch (format) {
@@ -1197,8 +1123,6 @@ static GLenum convert_target_to_gl(eGPUTextureTarget target)
   switch (target) {
     case TEXTARGET_2D:
       return GL_TEXTURE_2D;
-    case TEXTARGET_CUBE_MAP:
-      return GL_TEXTURE_CUBE_MAP;
     case TEXTARGET_2D_ARRAY:
       return GL_TEXTURE_2D_ARRAY;
     case TEXTARGET_TILE_MAPPING:
@@ -1209,48 +1133,72 @@ static GLenum convert_target_to_gl(eGPUTextureTarget target)
   }
 }
 
-/* TODO(fclem) This function should be remove and gpu_texture_image rewritten to not use any GL
- * commands. */
-GPUTexture *GPU_texture_from_bindcode(eGPUTextureTarget target, int bindcode)
+/* Create an error texture that will bind an invalid texture (pink) at draw time. */
+GPUTexture *GPU_texture_create_error(eGPUTextureTarget target)
 {
   GLenum textarget = convert_target_to_gl(target);
 
   GPUTexture *tex = (GPUTexture *)MEM_callocN(sizeof(GPUTexture), __func__);
-  tex->bindcode = bindcode;
+  tex->bindcode = 0;
   tex->refcount = 1;
   tex->target = textarget;
   tex->target_base = textarget;
   tex->samples = 0;
-  tex->sampler_state = GPU_SAMPLER_REPEAT | GPU_SAMPLER_ANISO;
-  if (GPU_get_mipmap()) {
-    tex->sampler_state |= (GPU_SAMPLER_MIPMAP | GPU_SAMPLER_FILTER);
-  }
+  tex->sampler_state = GPU_SAMPLER_DEFAULT;
   tex->number = -1;
 
-  if (!glIsTexture(tex->bindcode)) {
-    GPU_print_error_debug("Blender Texture Not Loaded");
+  GPU_print_error_debug("Blender Texture Not Loaded");
+  return tex;
+}
+
+/* DDS texture loading. Return NULL if support is not available. */
+GPUTexture *GPU_texture_create_compressed(
+    int w, int h, int miplen, eGPUTextureFormat tex_format, const void *data)
+{
+  if (!GLEW_EXT_texture_compression_s3tc) {
+    return NULL;
   }
-  else {
-    GLint w, h, gl_format;
-    GLenum gettarget;
-    gettarget = (textarget == GL_TEXTURE_CUBE_MAP) ? GL_TEXTURE_CUBE_MAP_POSITIVE_X : textarget;
-
-    glBindTexture(textarget, tex->bindcode);
-    glGetTexLevelParameteriv(gettarget, 0, GL_TEXTURE_WIDTH, &w);
-    glGetTexLevelParameteriv(gettarget, 0, GL_TEXTURE_HEIGHT, &h);
-    glGetTexLevelParameteriv(gettarget, 0, GL_TEXTURE_INTERNAL_FORMAT, &gl_format);
-    tex->w = w;
-    tex->h = h;
-    tex->format = gl_internalformat_to_gpu_format(gl_format);
-    tex->components = gpu_get_component_count(tex->format);
-    glBindTexture(textarget, 0);
-
-    /* Depending on how this bindcode was obtained, the memory used here could
-     * already have been computed.
-     * But that is not the case currently. */
-    gpu_texture_memory_footprint_add(tex);
+
+  GPUTexture *tex = (GPUTexture *)MEM_callocN(sizeof(GPUTexture), __func__);
+  tex->w = w;
+  tex->h = h;
+  tex->refcount = 1;
+  tex->target = tex->target_base = GL_TEXTURE_2D;
+  tex->format_flag = static_cast<eGPUTextureFormatFlag>(0);
+  tex->components = gpu_get_component_count(tex_format);
+  tex->mipma

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list