From a784e90be02548aa38ba7c6d48087a819ea8693d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Mon, 7 Sep 2020 19:17:04 +0200 Subject: EEVEE: Try to allocate the lightcache and use fallback if failure This is to remove an explicit opengl dependence to GPU_extension. --- .../blender/draw/engines/eevee/eevee_lightcache.c | 38 ++++++++++------------ source/blender/gpu/GPU_extensions.h | 1 - source/blender/gpu/intern/gpu_extensions.cc | 6 ---- source/blender/gpu/opengl/gl_shader.cc | 2 +- source/blender/gpu/opengl/gl_texture.cc | 5 +-- 5 files changed, 22 insertions(+), 30 deletions(-) diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c index 49d68481045..5de161a646b 100644 --- a/source/blender/draw/engines/eevee/eevee_lightcache.c +++ b/source/blender/draw/engines/eevee/eevee_lightcache.c @@ -348,17 +348,14 @@ LightCache *EEVEE_lightcache_create(const int grid_len, int mips_len = log2_floor_u(cube_size) - MIN_CUBE_LOD_LEVEL; - if (GPU_arb_texture_cube_map_array_is_supported()) { - light_cache->cube_tx.tex = DRW_texture_create_cube_array( - cube_size, cube_len, GPU_R11F_G11F_B10F, DRW_TEX_FILTER | DRW_TEX_MIPMAP, NULL); - } - else { - light_cache->cube_tx.tex = DRW_texture_create_2d_array(cube_size, - cube_size, - cube_len * 6, - GPU_R11F_G11F_B10F, - DRW_TEX_FILTER | DRW_TEX_MIPMAP, - NULL); + /* Try to create a cubemap array. */ + DRWTextureFlag cube_texflag = DRW_TEX_FILTER | DRW_TEX_MIPMAP; + light_cache->cube_tx.tex = DRW_texture_create_cube_array( + cube_size, cube_len, GPU_R11F_G11F_B10F, cube_texflag, NULL); + if (light_cache->cube_tx.tex == NULL) { + /* Try fallback to 2D array. */ + light_cache->cube_tx.tex = DRW_texture_create_2d_array( + cube_size, cube_size, cube_len * 6, GPU_R11F_G11F_B10F, cube_texflag, NULL); } light_cache->cube_tx.tex_size[0] = cube_size; @@ -414,15 +411,16 @@ static bool eevee_lightcache_static_load(LightCache *lcache) } if (lcache->cube_tx.tex == NULL) { - if (GPU_arb_texture_cube_map_array_is_supported()) { - lcache->cube_tx.tex = GPU_texture_create_cube_array("lightcache_cubemaps", - lcache->cube_tx.tex_size[0], - lcache->cube_tx.tex_size[2] / 6, - lcache->mips_len + 1, - GPU_R11F_G11F_B10F, - NULL); - } - else { + /* Try to create a cubemap array. */ + lcache->cube_tx.tex = GPU_texture_create_cube_array("lightcache_cubemaps", + lcache->cube_tx.tex_size[0], + lcache->cube_tx.tex_size[2] / 6, + lcache->mips_len + 1, + GPU_R11F_G11F_B10F, + NULL); + + if (lcache->cube_tx.tex == NULL) { + /* Try fallback to 2D array. */ lcache->cube_tx.tex = GPU_texture_create_2d_array("lightcache_cubemaps_fallback", UNPACK3(lcache->cube_tx.tex_size), lcache->mips_len + 1, diff --git a/source/blender/gpu/GPU_extensions.h b/source/blender/gpu/GPU_extensions.h index dd0a2ec9f39..357e867775a 100644 --- a/source/blender/gpu/GPU_extensions.h +++ b/source/blender/gpu/GPU_extensions.h @@ -41,7 +41,6 @@ int GPU_max_color_texture_samples(void); int GPU_max_cube_map_size(void); int GPU_max_ubo_binds(void); int GPU_max_ubo_size(void); -bool GPU_arb_texture_cube_map_array_is_supported(void); bool GPU_mip_render_workaround(void); bool GPU_depth_blitting_workaround(void); bool GPU_use_main_context_workaround(void); diff --git a/source/blender/gpu/intern/gpu_extensions.cc b/source/blender/gpu/intern/gpu_extensions.cc index 168d2fb3fbb..e06828bf994 100644 --- a/source/blender/gpu/intern/gpu_extensions.cc +++ b/source/blender/gpu/intern/gpu_extensions.cc @@ -81,12 +81,6 @@ int GPU_max_textures(void) return GCaps.max_textures; } -bool GPU_arb_texture_cube_map_array_is_supported(void) -{ - /* FIXME bad level call. */ - return GLContext::texture_cube_map_array_support; -} - bool GPU_mip_render_workaround(void) { return GCaps.mip_render_workaround; diff --git a/source/blender/gpu/opengl/gl_shader.cc b/source/blender/gpu/opengl/gl_shader.cc index f125afeb535..76e20de1e51 100644 --- a/source/blender/gpu/opengl/gl_shader.cc +++ b/source/blender/gpu/opengl/gl_shader.cc @@ -113,7 +113,7 @@ char *GLShader::glsl_patch_get(void) STR_CONCAT(patch, slen, "#extension GL_ARB_shader_draw_parameters : enable\n"); STR_CONCAT(patch, slen, "#define GPU_ARB_shader_draw_parameters\n"); } - if (GPU_arb_texture_cube_map_array_is_supported()) { + if (GLContext::texture_cube_map_array_support) { STR_CONCAT(patch, slen, "#extension GL_ARB_texture_cube_map_array : enable\n"); STR_CONCAT(patch, slen, "#define GPU_ARB_texture_cube_map_array\n"); } diff --git a/source/blender/gpu/opengl/gl_texture.cc b/source/blender/gpu/opengl/gl_texture.cc index ba2e5844cc7..4c3d34a759f 100644 --- a/source/blender/gpu/opengl/gl_texture.cc +++ b/source/blender/gpu/opengl/gl_texture.cc @@ -71,8 +71,9 @@ bool GLTexture::init_internal(void) format_ = GPU_DEPTH32F_STENCIL8; } - if ((type_ == GPU_TEXTURE_CUBE_ARRAY) && !GPU_arb_texture_cube_map_array_is_supported()) { - debug::raise_gl_error("Attempt to create a cubemap array without hardware support!"); + if ((type_ == GPU_TEXTURE_CUBE_ARRAY) && (GLContext::texture_cube_map_array_support == false)) { + /* Silently fail and let the caller handle the error. */ + // debug::raise_gl_error("Attempt to create a cubemap array without hardware support!"); return false; } -- cgit v1.2.3