diff --git a/src/api/l_graphics_shader.c b/src/api/l_graphics_shader.c index 445ef6a1..53560d46 100644 --- a/src/api/l_graphics_shader.c +++ b/src/api/l_graphics_shader.c @@ -197,6 +197,13 @@ static int l_lovrShaderHasUniform(lua_State* L) { return 1; } +static int l_lovrShaderHasBlock(lua_State* L) { + Shader* shader = luax_checktype(L, 1, Shader); + const char* name = luaL_checkstring(L, 2); + lua_pushboolean(L, lovrShaderHasBlock(shader, name)); + return 1; +} + static int l_lovrShaderSend(lua_State* L) { Shader* shader = luax_checktype(L, 1, Shader); const char* name = luaL_checkstring(L, 2); @@ -222,6 +229,7 @@ static int l_lovrShaderSend(lua_State* L) { static int l_lovrShaderSendBlock(lua_State* L) { Shader* shader = luax_checktype(L, 1, Shader); const char* name = luaL_checkstring(L, 2); + lovrAssert(lovrShaderHasBlock(shader, name), "Unknown shader block '%s'", name); ShaderBlock* block = luax_checktype(L, 3, ShaderBlock); UniformAccess access = luaL_checkoption(L, 4, "readwrite", UniformAccesses); Buffer* buffer = lovrShaderBlockGetBuffer(block); @@ -251,6 +259,7 @@ static int l_lovrShaderSendImage(lua_State* L) { const luaL_Reg lovrShader[] = { { "getType", l_lovrShaderGetType }, { "hasUniform", l_lovrShaderHasUniform }, + { "hasBlock", l_lovrShaderHasBlock }, { "send", l_lovrShaderSend }, { "sendBlock", l_lovrShaderSendBlock }, { "sendImage", l_lovrShaderSendImage }, diff --git a/src/modules/graphics/shader.c b/src/modules/graphics/shader.c index 9836b267..7571bd9d 100644 --- a/src/modules/graphics/shader.c +++ b/src/modules/graphics/shader.c @@ -86,6 +86,10 @@ bool lovrShaderHasUniform(Shader* shader, const char* name) { return map_get(&shader->uniformMap, hash64(name, strlen(name))) != MAP_NIL; } +bool lovrShaderHasBlock(Shader* shader, const char* name) { + return map_get(&shader->blockMap, hash64(name, strlen(name))) != MAP_NIL; +} + const Uniform* lovrShaderGetUniform(Shader* shader, const char* name) { uint64_t index = map_get(&shader->uniformMap, hash64(name, strlen(name))); return index == MAP_NIL ? NULL : &shader->uniforms.data[index]; diff --git a/src/modules/graphics/shader.h b/src/modules/graphics/shader.h index 880c9340..f3a407cb 100644 --- a/src/modules/graphics/shader.h +++ b/src/modules/graphics/shader.h @@ -133,6 +133,7 @@ void lovrShaderDestroy(void* ref); ShaderType lovrShaderGetType(Shader* shader); int lovrShaderGetAttributeLocation(Shader* shader, const char* name); bool lovrShaderHasUniform(Shader* shader, const char* name); +bool lovrShaderHasBlock(Shader* shader, const char* name); const Uniform* lovrShaderGetUniform(Shader* shader, const char* name); void lovrShaderSetFloats(Shader* shader, const char* name, float* data, int start, int count); void lovrShaderSetInts(Shader* shader, const char* name, int* data, int start, int count);