[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