Add sn10x3 data type;

The unpacking code might not be working properly...
This commit is contained in:
bjorn 2024-01-20 17:18:54 -08:00
parent 4e2c0111c7
commit 5434dd6add
7 changed files with 13 additions and 3 deletions

View File

@ -80,6 +80,7 @@ StringEntry lovrDataType[] = {
[TYPE_U8x4] = ENTRY("u8x4"),
[TYPE_SN8x4] = ENTRY("sn8x4"),
[TYPE_UN8x4] = ENTRY("un8x4"),
[TYPE_SN10x3] = ENTRY("sn10x3"),
[TYPE_UN10x3] = ENTRY("un10x3"),
[TYPE_I16] = ENTRY("i16"),
[TYPE_I16x2] = ENTRY("i16x2"),

View File

@ -10,6 +10,7 @@ static const uint32_t typeComponents[] = {
[TYPE_U8x4] = 4,
[TYPE_SN8x4] = 4,
[TYPE_UN8x4] = 4,
[TYPE_SN10x3] = 3,
[TYPE_UN10x3] = 3,
[TYPE_I16] = 1,
[TYPE_I16x2] = 2,
@ -70,7 +71,8 @@ void luax_checkfieldn(lua_State* L, int index, int type, void* data) {
case TYPE_U8x4: p.u8[i] = (uint8_t) x; break;
case TYPE_SN8x4: p.i8[i] = (int8_t) CLAMP(x, -1.f, 1.f) * INT8_MAX; break;
case TYPE_UN8x4: p.u8[i] = (uint8_t) CLAMP(x, 0.f, 1.f) * UINT8_MAX; break;
case TYPE_UN10x3: p.u32[0] |= (uint32_t) (CLAMP(x, 0.f, 1.f) * 1023.f) << (10 * (2 - i)); break;
case TYPE_SN10x3: p.u32[0] |= (((uint32_t) (int32_t) (CLAMP(x, -1.f, 1.f) * 511.f)) & 0x3ff) << (10 * i); break;
case TYPE_UN10x3: p.u32[0] |= (((uint32_t) (CLAMP(x, 0.f, 1.f) * 1023.f)) & 0x3ff) << (10 * i); break;
case TYPE_I16: p.i16[i] = (int16_t) x; break;
case TYPE_I16x2: p.i16[i] = (int16_t) x; break;
case TYPE_I16x4: p.i16[i] = (int16_t) x; break;
@ -122,7 +124,8 @@ void luax_checkfieldv(lua_State* L, int index, int type, void* data) {
case TYPE_U8x4: for (int i = 0; i < 4; i++) p.u8[i] = (uint8_t) v[i]; break;
case TYPE_SN8x4: for (int i = 0; i < 4; i++) p.i8[i] = (int8_t) CLAMP(v[i], -1.f, 1.f) * INT8_MAX; break;
case TYPE_UN8x4: for (int i = 0; i < 4; i++) p.u8[i] = (uint8_t) CLAMP(v[i], 0.f, 1.f) * UINT8_MAX; break;
case TYPE_UN10x3: for (int i = 0; i < 3; i++) p.u32[0] |= (uint32_t) (CLAMP(v[i], 0.f, 1.f) * 1023.f) << (10 * (2 - i)); break;
case TYPE_SN10x3: for (int i = 0; i < 3; i++) p.u32[0] |= (((uint32_t) (int32_t) (CLAMP(v[i], -1.f, 1.f) * 511.f)) & 0x3ff) << (10 * i); break;
case TYPE_UN10x3: for (int i = 0; i < 3; i++) p.u32[0] |= (((uint32_t) (CLAMP(v[i], 0.f, 1.f) * 1023.f)) & 0x3ff) << (10 * i); break;
case TYPE_I16x2: for (int i = 0; i < 2; i++) p.i16[i] = (int16_t) v[i]; break;
case TYPE_I16x4: for (int i = 0; i < 4; i++) p.i16[i] = (int16_t) v[i]; break;
case TYPE_U16x2: for (int i = 0; i < 2; i++) p.u16[i] = (uint16_t) v[i]; break;
@ -325,7 +328,8 @@ static int luax_pushcomponents(lua_State* L, DataType type, char* data) {
case TYPE_U8x4: for (int i = 0; i < 4; i++) lua_pushinteger(L, p.u8[i]); return 4;
case TYPE_SN8x4: for (int i = 0; i < 4; i++) lua_pushnumber(L, MAX((float) p.i8[i] / 127, -1.f)); return 4;
case TYPE_UN8x4: for (int i = 0; i < 4; i++) lua_pushnumber(L, (float) p.u8[i] / 255); return 4;
case TYPE_UN10x3: for (int i = 0; i < 3; i++) lua_pushnumber(L, (float) ((p.u32[0] >> (10 * (2 - i))) & 0x3ff) / 1023.f); return 3;
case TYPE_SN10x3: for (int i = 0; i < 3; i++) lua_pushnumber(L, (float) ((p.i32[0] >> (10 * i)) & 0x3ff) / 511.f); return 3;
case TYPE_UN10x3: for (int i = 0; i < 3; i++) lua_pushnumber(L, (float) ((p.u32[0] >> (10 * i)) & 0x3ff) / 1023.f); return 3;
case TYPE_I16x2: for (int i = 0; i < 2; i++) lua_pushinteger(L, p.i16[i]); return 2;
case TYPE_I16x4: for (int i = 0; i < 4; i++) lua_pushinteger(L, p.i16[i]); return 4;
case TYPE_U16x2: for (int i = 0; i < 2; i++) lua_pushinteger(L, p.u16[i]); return 2;

View File

@ -371,6 +371,7 @@ typedef enum {
GPU_TYPE_U8x4,
GPU_TYPE_SN8x4,
GPU_TYPE_UN8x4,
GPU_TYPE_SN10x3,
GPU_TYPE_UN10x3,
GPU_TYPE_I16,
GPU_TYPE_I16x2,

View File

@ -1357,6 +1357,7 @@ bool gpu_pipeline_init_graphics(gpu_pipeline* pipeline, gpu_pipeline_info* info)
[GPU_TYPE_U8x4] = VK_FORMAT_R8G8B8A8_UINT,
[GPU_TYPE_SN8x4] = VK_FORMAT_R8G8B8A8_SNORM,
[GPU_TYPE_UN8x4] = VK_FORMAT_R8G8B8A8_UNORM,
[GPU_TYPE_SN10x3] = VK_FORMAT_A2B10G10R10_SNORM_PACK32,
[GPU_TYPE_UN10x3] = VK_FORMAT_A2B10G10R10_UNORM_PACK32,
[GPU_TYPE_I16] = VK_FORMAT_R16_SINT,
[GPU_TYPE_I16x2] = VK_FORMAT_R16G16_SINT,

View File

@ -305,6 +305,7 @@ bool gpu_pipeline_init_graphics(gpu_pipeline* pipeline, gpu_pipeline_info* info)
[GPU_TYPE_U8x4] = WGPUVertexFormat_Uint8x4,
[GPU_TYPE_SN8x4] = WGPUVertexFormat_Snorm8x4,
[GPU_TYPE_UN8x4] = WGPUVertexFormat_Unorm8x4,
[GPU_TYPE_SN10x3] = WGPUVertexFormat_Undefined,
[GPU_TYPE_UN10x3] = WGPUVertexFormat_Undefined,
[GPU_TYPE_I16] = WGPUVertexFormat_Undefined,
[GPU_TYPE_I16x2] = WGPUVertexFormat_Sint16x2,

View File

@ -1759,6 +1759,7 @@ uint32_t lovrGraphicsAlignFields(DataField* parent, DataLayout layout) {
[TYPE_U8x4] = { 4, 1, 4 },
[TYPE_SN8x4] = { 4, 1, 4 },
[TYPE_UN8x4] = { 4, 1, 4 },
[TYPE_SN10x3] = { 4, 4, 4 },
[TYPE_UN10x3] = { 4, 4, 4 },
[TYPE_I16] = { 2, 2, 2 },
[TYPE_I16x2] = { 4, 2, 4 },

View File

@ -116,6 +116,7 @@ typedef enum {
TYPE_U8x4,
TYPE_SN8x4,
TYPE_UN8x4,
TYPE_SN10x3,
TYPE_UN10x3,
TYPE_I16,
TYPE_I16x2,