[Bf-blender-cvs] [2e61c446acb] master: GPU: Explicit Texture Usage Flags for enabling GPU Backend optimizations.

Jason Fielder noreply at git.blender.org
Thu Dec 8 23:32:28 CET 2022


Commit: 2e61c446acb189ecfbd5ba4508082a25ec9f4369
Author: Jason Fielder
Date:   Thu Dec 8 23:30:57 2022 +0100
Branches: master
https://developer.blender.org/rB2e61c446acb189ecfbd5ba4508082a25ec9f4369

GPU: Explicit Texture Usage Flags for enabling GPU Backend optimizations.

Texture usage flags can now be provided during texture creation specifying
the ways in which a texture can be used. This allows the GPU backends to
perform contextual optimizations which were not previously possible. This
includes enablement of hardware lossless compression which can result in
a 15%+ performance uplift for bandwidth-limited scenes on hardware such
as Apple-Silicon using Metal.

GPU_TEXTURE_USAGE_GENERAL can be used by default if usage is not known
ahead of time. Patch will also be relevant for the Vulkan backend.

Authored by Apple: Michael Parkin-White

Ref T96261

Reviewed By: fclem
Differential Revision: https://developer.blender.org/D15967

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

M	intern/opencolorio/ocio_impl_glsl.cc
M	source/blender/blenfont/intern/blf_glyph.c
M	source/blender/blenkernel/intern/image_gpu.cc
M	source/blender/blenkernel/intern/studiolight.c
M	source/blender/draw/engines/eevee/eevee_depth_of_field.c
M	source/blender/draw/engines/eevee/eevee_lightcache.c
M	source/blender/draw/engines/eevee/eevee_motion_blur.c
M	source/blender/draw/engines/eevee_next/eevee_depth_of_field.cc
M	source/blender/draw/engines/eevee_next/eevee_hizbuffer.cc
M	source/blender/draw/engines/eevee_next/eevee_pipeline.hh
M	source/blender/draw/engines/gpencil/gpencil_antialiasing.c
M	source/blender/draw/engines/image/image_space_image.hh
M	source/blender/draw/engines/overlay/overlay_edit_uv.cc
M	source/blender/draw/engines/select/select_engine.c
M	source/blender/draw/engines/workbench/workbench_effect_antialiasing.c
M	source/blender/draw/engines/workbench/workbench_render.c
M	source/blender/draw/engines/workbench/workbench_volume.c
M	source/blender/draw/intern/DRW_gpu_wrapper.hh
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_cache_impl_volume.cc
M	source/blender/draw/intern/draw_common.c
M	source/blender/draw/intern/draw_curves.cc
M	source/blender/draw/intern/draw_fluid.c
M	source/blender/draw/intern/draw_hair.cc
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/intern/draw_manager_texture.c
M	source/blender/draw/intern/draw_texture_pool.cc
M	source/blender/draw/intern/draw_texture_pool.h
M	source/blender/draw/intern/draw_volume.cc
M	source/blender/editors/interface/interface_icons.cc
M	source/blender/editors/sculpt_paint/paint_cursor.cc
M	source/blender/editors/space_clip/clip_draw.c
M	source/blender/editors/space_sequencer/sequencer_draw.c
M	source/blender/gpu/GPU_texture.h
M	source/blender/gpu/intern/gpu_framebuffer.cc
M	source/blender/gpu/intern/gpu_material.c
M	source/blender/gpu/intern/gpu_texture.cc
M	source/blender/gpu/intern/gpu_texture_private.hh
M	source/blender/gpu/intern/gpu_viewport.c
M	source/blender/gpu/metal/mtl_texture.hh
M	source/blender/gpu/metal/mtl_texture.mm
M	source/blender/gpu/metal/mtl_texture_util.mm
M	source/blender/imbuf/intern/util_gpu.c
M	source/blender/windowmanager/intern/wm_operators.c
M	source/blender/windowmanager/intern/wm_playanim.c

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

diff --git a/intern/opencolorio/ocio_impl_glsl.cc b/intern/opencolorio/ocio_impl_glsl.cc
index 150ed1a58bb..6a72cd2aacb 100644
--- a/intern/opencolorio/ocio_impl_glsl.cc
+++ b/intern/opencolorio/ocio_impl_glsl.cc
@@ -337,10 +337,12 @@ static bool addGPULut1D2D(OCIO_GPUTextures &textures,
    * It depends on more than height. So check instead by looking at the source. */
   std::string sampler1D_name = std::string("sampler1D ") + sampler_name;
   if (strstr(shader_desc->getShaderText(), sampler1D_name.c_str()) != nullptr) {
-    lut.texture = GPU_texture_create_1d(texture_name, width, 1, format, values);
+    lut.texture = GPU_texture_create_1d_ex(
+        texture_name, width, 1, format, GPU_TEXTURE_USAGE_SHADER_READ, values);
   }
   else {
-    lut.texture = GPU_texture_create_2d(texture_name, width, height, 1, format, values);
+    lut.texture = GPU_texture_create_2d_ex(
+        texture_name, width, height, 1, format, GPU_TEXTURE_USAGE_SHADER_READ, values);
   }
   if (lut.texture == nullptr) {
     return false;
@@ -372,8 +374,15 @@ static bool addGPULut3D(OCIO_GPUTextures &textures,
   }
 
   OCIO_GPULutTexture lut;
-  lut.texture = GPU_texture_create_3d(
-      texture_name, edgelen, edgelen, edgelen, 1, GPU_RGB16F, GPU_DATA_FLOAT, values);
+  lut.texture = GPU_texture_create_3d_ex(texture_name,
+                                         edgelen,
+                                         edgelen,
+                                         edgelen,
+                                         1,
+                                         GPU_RGB16F,
+                                         GPU_DATA_FLOAT,
+                                         GPU_TEXTURE_USAGE_SHADER_READ,
+                                         values);
   if (lut.texture == nullptr) {
     return false;
   }
@@ -442,7 +451,8 @@ static bool createGPUCurveMapping(OCIO_GPUCurveMappping &curvemap,
   if (curve_mapping_settings) {
     int lut_size = curve_mapping_settings->lut_size;
 
-    curvemap.texture = GPU_texture_create_1d("OCIOCurveMap", lut_size, 1, GPU_RGBA16F, nullptr);
+    curvemap.texture = GPU_texture_create_1d_ex(
+        "OCIOCurveMap", lut_size, 1, GPU_RGBA16F, GPU_TEXTURE_USAGE_SHADER_READ, nullptr);
     GPU_texture_filter_mode(curvemap.texture, false);
     GPU_texture_wrap_mode(curvemap.texture, false, true);
 
diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c
index b60ca3da1ea..b95a48daccf 100644
--- a/source/blender/blenfont/intern/blf_glyph.c
+++ b/source/blender/blenfont/intern/blf_glyph.c
@@ -1199,7 +1199,8 @@ void blf_glyph_draw(FontBLF *font, GlyphCacheBLF *gc, GlyphBLF *g, const int x,
       if (gc->texture) {
         GPU_texture_free(gc->texture);
       }
-      gc->texture = GPU_texture_create_2d(__func__, w, h, 1, GPU_R8, NULL);
+      gc->texture = GPU_texture_create_2d_ex(
+          __func__, w, h, 1, GPU_R8, GPU_TEXTURE_USAGE_SHADER_READ, NULL);
 
       gc->bitmap_len_landed = 0;
     }
diff --git a/source/blender/blenkernel/intern/image_gpu.cc b/source/blender/blenkernel/intern/image_gpu.cc
index 6893a50638a..12f3287ef97 100644
--- a/source/blender/blenkernel/intern/image_gpu.cc
+++ b/source/blender/blenkernel/intern/image_gpu.cc
@@ -111,7 +111,8 @@ static GPUTexture *gpu_texture_create_tile_mapping(Image *ima, const int multivi
     tile_info[3] = tile_runtime->tilearray_size[1] / array_h;
   }
 
-  GPUTexture *tex = GPU_texture_create_1d_array(ima->id.name + 2, width, 2, 1, GPU_RGBA32F, data);
+  GPUTexture *tex = GPU_texture_create_1d_array_ex(
+      ima->id.name + 2, width, 2, 1, GPU_RGBA32F, GPU_TEXTURE_USAGE_SHADER_READ, data);
   GPU_texture_mipmap_mode(tex, false, false);
 
   MEM_freeN(data);
diff --git a/source/blender/blenkernel/intern/studiolight.c b/source/blender/blenkernel/intern/studiolight.c
index daad983f0bf..9a1d45434c2 100644
--- a/source/blender/blenkernel/intern/studiolight.c
+++ b/source/blender/blenkernel/intern/studiolight.c
@@ -478,8 +478,13 @@ static void studiolight_create_equirect_radiance_gputexture(StudioLight *sl)
     BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EXTERNAL_IMAGE_LOADED);
     ImBuf *ibuf = sl->equirect_radiance_buffer;
 
-    sl->equirect_radiance_gputexture = GPU_texture_create_2d(
-        "studiolight_radiance", ibuf->x, ibuf->y, 1, GPU_RGBA16F, ibuf->rect_float);
+    sl->equirect_radiance_gputexture = GPU_texture_create_2d_ex("studiolight_radiance",
+                                                                ibuf->x,
+                                                                ibuf->y,
+                                                                1,
+                                                                GPU_RGBA16F,
+                                                                GPU_TEXTURE_USAGE_SHADER_READ,
+                                                                ibuf->rect_float);
     GPUTexture *tex = sl->equirect_radiance_gputexture;
     GPU_texture_filter_mode(tex, true);
     GPU_texture_wrap_mode(tex, true, true);
@@ -499,7 +504,8 @@ static void studiolight_create_matcap_gputexture(StudioLightImage *sli)
     copy_v3_v3(*offset3, *offset4);
   }
 
-  sli->gputexture = GPU_texture_create_2d("matcap", ibuf->x, ibuf->y, 1, GPU_R11F_G11F_B10F, NULL);
+  sli->gputexture = GPU_texture_create_2d_ex(
+      "matcap", ibuf->x, ibuf->y, 1, GPU_R11F_G11F_B10F, GPU_TEXTURE_USAGE_SHADER_READ, NULL);
   GPU_texture_update(sli->gputexture, GPU_DATA_FLOAT, gpu_matcap_3components);
 
   MEM_SAFE_FREE(gpu_matcap_3components);
@@ -533,8 +539,13 @@ static void studiolight_create_equirect_irradiance_gputexture(StudioLight *sl)
   if (sl->flag & STUDIOLIGHT_EXTERNAL_FILE) {
     BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EQUIRECT_IRRADIANCE_IMAGE_CALCULATED);
     ImBuf *ibuf = sl->equirect_irradiance_buffer;
-    sl->equirect_irradiance_gputexture = GPU_texture_create_2d(
-        "studiolight_irradiance", ibuf->x, ibuf->y, 1, GPU_RGBA16F, ibuf->rect_float);
+    sl->equirect_irradiance_gputexture = GPU_texture_create_2d_ex("studiolight_irradiance",
+                                                                  ibuf->x,
+                                                                  ibuf->y,
+                                                                  1,
+                                                                  GPU_RGBA16F,
+                                                                  GPU_TEXTURE_USAGE_SHADER_READ,
+                                                                  ibuf->rect_float);
     GPUTexture *tex = sl->equirect_irradiance_gputexture;
     GPU_texture_filter_mode(tex, true);
     GPU_texture_wrap_mode(tex, true, true);
diff --git a/source/blender/draw/engines/eevee/eevee_depth_of_field.c b/source/blender/draw/engines/eevee/eevee_depth_of_field.c
index caa63b9c54c..e529411bbfd 100644
--- a/source/blender/draw/engines/eevee/eevee_depth_of_field.c
+++ b/source/blender/draw/engines/eevee/eevee_depth_of_field.c
@@ -362,9 +362,13 @@ static void dof_bokeh_pass_init(EEVEE_FramebufferList *fbl,
   DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropyInv", fx->dof_bokeh_aniso_inv);
   DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
 
-  fx->dof_bokeh_gather_lut_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_RG16F, owner);
-  fx->dof_bokeh_scatter_lut_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R16F, owner);
-  fx->dof_bokeh_resolve_lut_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R16F, owner);
+  eGPUTextureUsage usage = GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT;
+  fx->dof_bokeh_gather_lut_tx = DRW_texture_pool_query_2d_ex(
+      UNPACK2(res), GPU_RG16F, usage, owner);
+  fx->dof_bokeh_scatter_lut_tx = DRW_texture_pool_query_2d_ex(
+      UNPACK2(res), GPU_R16F, usage, owner);
+  fx->dof_bokeh_resolve_lut_tx = DRW_texture_pool_query_2d_ex(
+      UNPACK2(res), GPU_R16F, usage, owner);
 
   GPU_framebuffer_ensure_config(&fbl->dof_bokeh_fb,
                                 {
@@ -398,8 +402,10 @@ static void dof_setup_pass_init(EEVEE_FramebufferList *fbl,
   DRW_shgroup_uniform_float_copy(grp, "bokehMaxSize", fx->dof_bokeh_max_size);
   DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
 
-  fx->dof_half_res_color_tx = DRW_texture_pool_query_2d(UNPACK2(res), COLOR_FORMAT, owner);
-  fx->dof_half_res_coc_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_RG16F, owner);
+  eGPUTextureUsage usage = GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT;
+  fx->dof_half_res_color_tx = DRW_texture_pool_query_2d_ex(
+      UNPACK2(res), COLOR_FORMAT, usage, owner);
+  fx->dof_half_res_coc_tx = DRW_texture_pool_query_2d_ex(UNPACK2(res), GPU_RG16F, usage, owner);
 
   GPU_framebuffer_ensure_config(&fbl->dof_setup_fb,
                                 {
@@ -429,8 +435,11 @@ static void dof_flatten_tiles_pass_init(EEVEE_FramebufferList *fbl,
       grp, "halfResCocBuffer", &fx->dof_half_res_coc_tx, NO_FILTERING);
   DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
 
-  fx->dof_coc_tiles_fg_tx = DRW_texture_pool_query_2d(UNPACK2(res), FG_TILE_FORMAT, owner);
-  fx->dof_coc_tiles_bg_tx = DRW_texture_pool_query_2d(UNPACK2(res), BG_TILE_FORMAT, owner);
+  eGPUTextureUsage usage = GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT;
+  fx->dof_coc_tiles_fg_tx = DRW_texture_pool_query_2d_ex(
+      UNPACK2(res), FG_TILE_FORMAT, usage, owner);
+  fx->dof_coc_tiles_bg_tx = DRW_texture_pool_query_2d_ex(
+      UNPACK2(res), BG_TILE_FORMAT, usage, owner);
 
   GPU_framebuffer_ensure_config(&fbl->dof_flatten_tiles_fb,
                                 {
@@ -468,9 +477,11 @@ static void dof_dilate_tiles_pass_init(EEVEE_FramebufferList *fbl,
     DRW_shgroup_uniform_int(grp, "ringWidthMultiplier", &fx->dof_dilate_ring_width_multiplier, 1);
     DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
   }
-
-  fx->dof_coc_dilated_tiles_fg_tx = DRW_texture_pool_query_2d(UNPACK2(res), FG_TILE_FORMAT, owner);
-  fx->dof_coc_dilated_tiles_bg_tx = DRW_texture_pool_query_2d(UNPACK2(res), BG_TILE_FORMAT, owner);
+  eGPUTextureUsage usage = GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT;
+  fx->dof_coc_dilated_tiles_fg_tx = DRW_texture_pool_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list