lovr/src/api/types/shaderBlock.c

67 lines
2.2 KiB
C
Raw Normal View History

#include "api.h"
2018-09-27 00:54:12 +00:00
#include "api/graphics.h"
#include "graphics/shader.h"
2018-08-06 18:46:42 +00:00
int l_lovrShaderBlockIsWritable(lua_State* L) {
2018-08-06 17:42:19 +00:00
ShaderBlock* block = luax_checktype(L, 1, ShaderBlock);
2018-08-06 18:46:42 +00:00
lua_pushboolean(L, lovrShaderBlockGetType(block) == BLOCK_STORAGE);
2018-08-06 17:42:19 +00:00
return 1;
}
int l_lovrShaderBlockGetSize(lua_State* L) {
ShaderBlock* block = luax_checktype(L, 1, ShaderBlock);
2018-12-07 00:34:14 +00:00
Buffer* buffer = lovrShaderBlockGetBuffer(block);
lua_pushinteger(L, lovrBufferGetSize(buffer));
return 1;
}
2018-08-06 18:46:42 +00:00
int l_lovrShaderBlockGetOffset(lua_State* L) {
2018-08-06 17:41:57 +00:00
ShaderBlock* block = luax_checktype(L, 1, ShaderBlock);
2018-08-06 18:46:42 +00:00
const char* field = luaL_checkstring(L, 2);
const Uniform* uniform = lovrShaderBlockGetUniform(block, field);
lua_pushinteger(L, uniform->offset);
2018-08-06 17:41:57 +00:00
return 1;
}
int l_lovrShaderBlockSend(lua_State* L) {
ShaderBlock* block = luax_checktype(L, 1, ShaderBlock);
2018-08-06 17:42:23 +00:00
if (lua_type(L, 2) == LUA_TSTRING) {
const char* name = luaL_checkstring(L, 2);
const Uniform* uniform = lovrShaderBlockGetUniform(block, name);
lovrAssert(uniform, "Unknown uniform for ShaderBlock '%s'", name);
2018-12-07 00:34:14 +00:00
Buffer* buffer = lovrShaderBlockGetBuffer(block);
uint8_t* data = lovrBufferMap(buffer, uniform->offset);
2018-08-06 17:42:23 +00:00
luax_checkuniform(L, 3, uniform, data, name);
2018-12-07 00:34:14 +00:00
lovrBufferFlush(buffer, uniform->offset, uniform->size);
2018-08-06 17:42:23 +00:00
return 0;
} else {
Blob* blob = luax_checktype(L, 1, Blob);
2018-12-07 00:34:14 +00:00
Buffer* buffer = lovrShaderBlockGetBuffer(block);
void* data = lovrBufferMap(buffer, 0);
size_t bufferSize = lovrBufferGetSize(buffer);
size_t copySize = MIN(bufferSize, blob->size);
2018-08-06 17:42:23 +00:00
memcpy(data, blob->data, copySize);
2018-12-07 00:34:14 +00:00
lovrBufferFlush(buffer, 0, copySize);
2018-08-06 17:42:23 +00:00
lua_pushinteger(L, copySize);
return 1;
}
}
2018-08-06 18:46:42 +00:00
int l_lovrShaderBlockGetShaderCode(lua_State* L) {
ShaderBlock* block = luax_checktype(L, 1, ShaderBlock);
const char* blockName = luaL_checkstring(L, 2);
size_t length;
char* code = lovrShaderBlockGetShaderCode(block, blockName, &length);
lua_pushlstring(L, code, length);
return 1;
}
const luaL_Reg lovrShaderBlock[] = {
2018-08-06 17:41:57 +00:00
{ "isWritable", l_lovrShaderBlockIsWritable },
2018-08-06 18:46:42 +00:00
{ "getSize", l_lovrShaderBlockGetSize },
{ "getOffset", l_lovrShaderBlockGetOffset },
{ "send", l_lovrShaderBlockSend },
2018-08-06 18:46:42 +00:00
{ "getShaderCode", l_lovrShaderBlockGetShaderCode },
{ NULL, NULL }
};