@@ -4208,9 +4208,11 @@ static bool lovrMaterialAllocate(Material* material) {
42084208static void lovrMaterialRecycle (Material * material ) {
42094209 if (!material -> block ) return ;
42104210 mtx_lock (& state .lock );
4211- material -> block -> nodes [material -> index ].tick = state .tick ;
4212- material -> block -> tail = material -> index ;
4213- if (material -> block -> head == ~0u ) material -> block -> head = material -> block -> tail ;
4211+ MaterialBlock * block = material -> block ;
4212+ block -> nodes [material -> index ].tick = state .tick ;
4213+ if (block -> head == ~0u ) block -> head = material -> index ;
4214+ else block -> nodes [block -> tail ].next = material -> index ;
4215+ block -> tail = material -> index ;
42144216 material -> block = NULL ;
42154217 material -> index = ~0u ;
42164218 material -> bundle = NULL ;
@@ -4224,15 +4226,23 @@ static bool lovrMaterialUpload(Material* material) {
42244226
42254227 mtx_lock (& state .lock );
42264228 BufferView staging = getBuffer (GPU_BUFFER_STREAM , sizeof (MaterialData ), 4 );
4227- if (!staging .buffer ) return mtx_unlock (& state .lock ), NULL ;
4229+ if (!staging .buffer ) return mtx_unlock (& state .lock ), false ;
42284230 gpu_copy_buffers (state .stream , staging .buffer , material -> block -> buffer , staging .offset , MATERIAL_STRIDE * material -> index , sizeof (MaterialData ));
42294231 state .barrier .prev |= GPU_PHASE_COPY ;
42304232 state .barrier .next |= GPU_PHASE_SHADER_VERTEX | GPU_PHASE_SHADER_FRAGMENT ;
42314233 state .barrier .flush |= GPU_CACHE_TRANSFER_WRITE ;
42324234 state .barrier .clear |= GPU_CACHE_UNIFORM ;
42334235 material -> bufferTick = state .tick ;
42344236 material -> pointer = staging .pointer ;
4235- memcpy (material -> pointer , & material -> data , sizeof (MaterialData ));
4237+ memcpy (material -> pointer -> numbers , & material -> data .numbers , sizeof (material -> data .numbers ));
4238+ for (uint32_t i = 0 ; i < COLOR_COUNT ; i ++ ) {
4239+ material -> pointer -> colors [i ][0 ] = lovrMathGammaToLinear (material -> data .colors [i ][0 ]);
4240+ material -> pointer -> colors [i ][1 ] = lovrMathGammaToLinear (material -> data .colors [i ][1 ]);
4241+ material -> pointer -> colors [i ][2 ] = lovrMathGammaToLinear (material -> data .colors [i ][2 ]);
4242+ material -> pointer -> colors [i ][3 ] = material -> data .colors [i ][3 ];
4243+ }
4244+ memcpy (material -> pointer -> quad , material -> data .quad , sizeof (material -> data .quad ));
4245+ memcpy (material -> pointer -> sdfRange , material -> data .sdfRange , sizeof (material -> data .sdfRange ));
42364246 mtx_unlock (& state .lock );
42374247
42384248 return true;
0 commit comments