From 01fbedb225f16ed7f62c8576f1dcc4b15f20096a Mon Sep 17 00:00:00 2001 From: Sasha Szpakowski Date: Sun, 3 Mar 2024 12:40:23 -0400 Subject: [PATCH 1/3] vulkan: improve some error messages when shader compilation fails. --- src/modules/graphics/vulkan/Shader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/graphics/vulkan/Shader.cpp b/src/modules/graphics/vulkan/Shader.cpp index 63e90b601..96f073caf 100644 --- a/src/modules/graphics/vulkan/Shader.cpp +++ b/src/modules/graphics/vulkan/Shader.cpp @@ -59,7 +59,7 @@ public: uint32_t binaryBindingOffset; if (!comp.get_binary_offset_for_decoration(id, spv::DecorationBinding, binaryBindingOffset)) - throw love::Exception("could not get binary offset for binding"); + throw love::Exception("could not get binary offset for uniform %s binding", name.c_str()); spirv[binaryBindingOffset] = freeBinding; @@ -826,7 +826,7 @@ void Shader::compileShaders() uint32_t locationOffset; if (!comp.get_binary_offset_for_decoration(r.id, spv::DecorationLocation, locationOffset)) - throw love::Exception("could not get binary offset for location"); + throw love::Exception("could not get binary offset for vertex attribute %s location", r.name.c_str()); spirv[locationOffset] = (uint32_t)index; From 026e9f164a02f7d8e14bc24f07f450d1e287c8ae Mon Sep 17 00:00:00 2001 From: Sasha Szpakowski Date: Tue, 5 Mar 2024 21:01:05 -0400 Subject: [PATCH 2/3] tests: add a few more shader uniform tests --- testing/tests/graphics.lua | 57 ++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/testing/tests/graphics.lua b/testing/tests/graphics.lua index bc338b94d..ca24c4406 100644 --- a/testing/tests/graphics.lua +++ b/testing/tests/graphics.lua @@ -804,7 +804,7 @@ love.test.graphics.Shader = function(test) -- check valid shader local pixelcode1 = [[ - extern Image tex2; + uniform Image tex2; vec4 effect(vec4 color, Image tex, vec2 texture_coords, vec2 screen_coords) { vec4 texturecolor = Texel(tex2, texture_coords); return texturecolor * color; @@ -824,7 +824,7 @@ love.test.graphics.Shader = function(test) -- check invalid shader local pixelcode2 = [[ - extern float ww; + uniform float ww; vec4 effect(vec4 color, Image tex, vec2 texture_coords, vec2 screen_coords) { vec4 texturecolor = Texel(tex, texture_coords); float unused = ww * 3 * color; @@ -837,8 +837,8 @@ love.test.graphics.Shader = function(test) -- check using a shader to draw + sending uniforms -- shader will return a given color if overwrite set to 1, otherwise def. draw local pixelcode3 = [[ - extern vec4 col; - extern float overwrite; + uniform vec4 col; + uniform float overwrite; vec4 effect(vec4 color, Image tex, vec2 texture_coords, vec2 screen_coords) { vec4 texcol = Texel(tex, texture_coords); if (overwrite == 1.0) { @@ -850,7 +850,8 @@ love.test.graphics.Shader = function(test) ]] local shader3 = love.graphics.newShader(pixelcode3, vertexcode1) local canvas = love.graphics.newCanvas(16, 16) - love.graphics.setCanvas(canvas) + love.graphics.push("all") + love.graphics.setCanvas(canvas) -- set color to yellow love.graphics.setColor(1, 1, 0, 1) -- turn shader 'on' and use red to draw @@ -863,9 +864,8 @@ love.test.graphics.Shader = function(test) shader3:send('overwrite', 0) love.graphics.setShader(shader3) love.graphics.rectangle('fill', 8, 8, 8, 8) - love.graphics.setShader() - love.graphics.setColor(1, 1, 1, 1) - love.graphics.setCanvas() + love.graphics.pop() + local imgdata = love.graphics.readbackTexture(canvas) test:assertPixels(imgdata, { red = {{1,1},{1,7},{7,7},{7,1}}, @@ -873,6 +873,47 @@ love.test.graphics.Shader = function(test) }, 'shader draw check') test:compareImg(imgdata) + -- test some uncommon paths for shader uniforms + local shader4 = love.graphics.newShader[[ + uniform bool booleans[5]; + vec4 effect(vec4 vcolor, Image tex, vec2 tc, vec2 pc) { + return booleans[3] ? vec4(0, 1, 0, 0) : vec4(1, 0, 0, 0); + } + ]] + + shader4:send("booleans", false, true, true) + + local shader5 = love.graphics.newShader[[ + uniform sampler2D textures[5]; + vec4 effect(vec4 vcolor, Image tex, vec2 tc, vec2 pc) { + return Texel(textures[2], tc) + Texel(textures[3], tc); + } + ]] + + local canvas2 = love.graphics.newCanvas(1, 1) + love.graphics.setCanvas(canvas2) + love.graphics.clear(0, 0.5, 0, 1) + love.graphics.setCanvas() + + shader5:send("textures", canvas2, canvas2, canvas2, canvas2, canvas2) + + local shader6 = love.graphics.newShader[[ + struct Data { + bool boolValue; + float floatValue; + sampler2D tex; + }; + + uniform Data data[3]; + + vec4 effect(vec4 vcolor, Image tex, vec2 tc, vec2 pc) { + return data[1].boolValue ? Texel(data[0].tex, tc) : vec4(0.0, 0.0, 0.0, 0.0); + } + ]] + + shader6:send("data[1].boolValue", true) + shader6:send("data[0].tex", canvas2) + end From 32e777c156d379f41ef79ab1274847c7b6f6d272 Mon Sep 17 00:00:00 2001 From: Sasha Szpakowski Date: Tue, 5 Mar 2024 23:03:55 -0400 Subject: [PATCH 3/3] vulkan: fix a crash. --- src/modules/graphics/vulkan/Graphics.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/graphics/vulkan/Graphics.h b/src/modules/graphics/vulkan/Graphics.h index 084c2b836..d64aa3bff 100644 --- a/src/modules/graphics/vulkan/Graphics.h +++ b/src/modules/graphics/vulkan/Graphics.h @@ -449,7 +449,7 @@ private: std::vector>> cleanUpFunctions; std::vector>> readbackCallbacks; std::vector screenshotReadbackBuffers; - std::set usedShadersInFrame; + std::set> usedShadersInFrame; RenderpassState renderPassState; };