From 8f654ed408a8c7746db850775d6d1daec772d35b Mon Sep 17 00:00:00 2001 From: bjorn Date: Wed, 26 Apr 2023 22:18:06 -0700 Subject: [PATCH] Simplify fill shaders; Now there's 2 instead of 3! Behavior is the same, fill goes layer-by-layer onto each view until either the texture or canvas run out of layers. --- etc/shaders.h | 1 - etc/shaders/fill_array.frag | 3 ++- etc/shaders/fill_layer.frag | 11 ----------- src/api/l_graphics.c | 3 +-- src/modules/graphics/graphics.c | 21 ++------------------- src/modules/graphics/graphics.h | 3 +-- 6 files changed, 6 insertions(+), 36 deletions(-) delete mode 100644 etc/shaders/fill_layer.frag diff --git a/etc/shaders.h b/etc/shaders.h index eb0fa632..fe4ee07b 100644 --- a/etc/shaders.h +++ b/etc/shaders.h @@ -7,7 +7,6 @@ #include "shaders/equirect.frag.h" #include "shaders/fill.vert.h" #include "shaders/fill_array.frag.h" -#include "shaders/fill_layer.frag.h" #include "shaders/animator.comp.h" #include "shaders/blender.comp.h" #include "shaders/timewizard.comp.h" diff --git a/etc/shaders/fill_array.frag b/etc/shaders/fill_array.frag index 01db83cf..0486f6f6 100644 --- a/etc/shaders/fill_array.frag +++ b/etc/shaders/fill_array.frag @@ -1,11 +1,12 @@ #version 460 #extension GL_EXT_multiview : require #extension GL_GOOGLE_include_directive : require +#extension GL_EXT_samplerless_texture_functions : require #include "lovr.glsl" layout(set = 1, binding = 1) uniform texture2DArray ArrayTexture; vec4 lovrmain() { - return Color * getPixel(ArrayTexture, UV, ViewIndex); + return Color * getPixel(ArrayTexture, UV, min(ViewIndex, textureSize(ArrayTexture, 0).z - 1)); } diff --git a/etc/shaders/fill_layer.frag b/etc/shaders/fill_layer.frag deleted file mode 100644 index c9bedb2b..00000000 --- a/etc/shaders/fill_layer.frag +++ /dev/null @@ -1,11 +0,0 @@ -#version 460 -#extension GL_EXT_multiview : require -#extension GL_GOOGLE_include_directive : require - -#include "lovr.glsl" - -layout(set = 1, binding = 1) uniform texture2DArray ArrayTexture; - -vec4 lovrmain() { - return Color * getPixel(ArrayTexture, UV, 0); -} diff --git a/src/api/l_graphics.c b/src/api/l_graphics.c index 39516552..17484448 100644 --- a/src/api/l_graphics.c +++ b/src/api/l_graphics.c @@ -56,9 +56,8 @@ StringEntry lovrDefaultShader[] = { [SHADER_FONT] = ENTRY("font"), [SHADER_CUBEMAP] = ENTRY("cubemap"), [SHADER_EQUIRECT] = ENTRY("equirect"), - [SHADER_FILL] = ENTRY("fill"), + [SHADER_FILL_2D] = ENTRY("fill2d"), [SHADER_FILL_ARRAY] = ENTRY("fillarray"), - [SHADER_FILL_LAYER] = ENTRY("filllayer"), [SHADER_LOGO] = ENTRY("logo"), { 0 } }; diff --git a/src/modules/graphics/graphics.c b/src/modules/graphics/graphics.c index d70cc97b..0c141cfc 100644 --- a/src/modules/graphics/graphics.c +++ b/src/modules/graphics/graphics.c @@ -1760,7 +1760,7 @@ ShaderSource lovrGraphicsGetDefaultShaderSource(DefaultShader type, ShaderStage [STAGE_VERTEX] = { lovr_shader_cubemap_vert, sizeof(lovr_shader_cubemap_vert) }, [STAGE_FRAGMENT] = { lovr_shader_equirect_frag, sizeof(lovr_shader_equirect_frag) } }, - [SHADER_FILL] = { + [SHADER_FILL_2D] = { [STAGE_VERTEX] = { lovr_shader_fill_vert, sizeof(lovr_shader_fill_vert) }, [STAGE_FRAGMENT] = { lovr_shader_unlit_frag, sizeof(lovr_shader_unlit_frag) } }, @@ -1768,10 +1768,6 @@ ShaderSource lovrGraphicsGetDefaultShaderSource(DefaultShader type, ShaderStage [STAGE_VERTEX] = { lovr_shader_fill_vert, sizeof(lovr_shader_fill_vert) }, [STAGE_FRAGMENT] = { lovr_shader_fill_array_frag, sizeof(lovr_shader_fill_array_frag) } }, - [SHADER_FILL_LAYER] = { - [STAGE_VERTEX] = { lovr_shader_fill_vert, sizeof(lovr_shader_fill_vert) }, - [STAGE_FRAGMENT] = { lovr_shader_fill_layer_frag, sizeof(lovr_shader_fill_layer_frag) } - }, [SHADER_LOGO] = { [STAGE_VERTEX] = { lovr_shader_unlit_vert, sizeof(lovr_shader_unlit_vert) }, [STAGE_FRAGMENT] = { lovr_shader_logo_frag, sizeof(lovr_shader_logo_frag) } @@ -5693,22 +5689,9 @@ void lovrPassSkybox(Pass* pass, Texture* texture) { } void lovrPassFill(Pass* pass, Texture* texture) { - DefaultShader shader; - - if (!texture || texture->info.layers == 1) { - shader = SHADER_FILL; - } else if (pass->viewCount > 1 && texture->info.layers > 1) { - lovrCheck(texture->info.layers == pass->viewCount, "Texture layer counts must match to fill between them"); - shader = SHADER_FILL_ARRAY; - } else if (pass->viewCount == 1 && texture->info.layers > 1) { - shader = SHADER_FILL_LAYER; - } else { - lovrUnreachable(); - } - lovrPassDraw(pass, &(Draw) { .mode = MESH_TRIANGLES, - .shader = shader, + .shader = texture && texture->info.type == TEXTURE_ARRAY ? SHADER_FILL_ARRAY : SHADER_FILL_2D, .material = texture ? lovrTextureGetMaterial(texture) : NULL, .vertex.format = VERTEX_EMPTY, .count = 3 diff --git a/src/modules/graphics/graphics.h b/src/modules/graphics/graphics.h index 51a88ce6..710c7530 100644 --- a/src/modules/graphics/graphics.h +++ b/src/modules/graphics/graphics.h @@ -281,9 +281,8 @@ typedef enum { SHADER_FONT, SHADER_CUBEMAP, SHADER_EQUIRECT, - SHADER_FILL, + SHADER_FILL_2D, SHADER_FILL_ARRAY, - SHADER_FILL_LAYER, SHADER_LOGO, SHADER_ANIMATOR, SHADER_BLENDER,