@@ -12,7 +12,8 @@ struct gpu_buffer {
1212struct gpu_texture {
1313 WGpuTexture handle ;
1414 WGpuTextureView view ;
15- WGPU_TEXTURE_FORMAT format ;
15+ gpu_texture_format format ;
16+ bool srgb ;
1617};
1718
1819struct gpu_sampler {
@@ -100,7 +101,7 @@ static struct {
100101#define MAX (a , b ) (a > b ? a : b)
101102
102103static WGPU_TEXTURE_FORMAT convertFormat (gpu_texture_format format , bool srgb );
103- static uint32_t getRowSize (WGPU_TEXTURE_FORMAT format , uint32_t width );
104+ static uint32_t getRowSize (gpu_texture_format format , uint32_t width );
104105
105106// Buffer
106107
@@ -189,6 +190,9 @@ bool gpu_texture_init(gpu_texture* texture, gpu_texture_info* info) {
189190 [GPU_TEXTURE_ARRAY ] = WGPU_TEXTURE_DIMENSION_2D
190191 };
191192
193+ texture -> format = info -> format ;
194+ texture -> srgb = info -> srgb ;
195+
192196 texture -> handle = wgpu_device_create_texture (state .device , & (WGpuTextureDescriptor ) {
193197 .usage =
194198 ((info -> usage & GPU_TEXTURE_RENDER ) ? WGPU_TEXTURE_USAGE_RENDER_ATTACHMENT : 0 ) |
@@ -201,9 +205,11 @@ bool gpu_texture_init(gpu_texture* texture, gpu_texture_info* info) {
201205 .width = info -> size [0 ],
202206 .height = info -> size [1 ],
203207 .depthOrArrayLayers = info -> size [2 ],
204- .format = convertFormat (info -> format , info -> srgb ),
208+ .format = convertFormat (info -> format , false ),
205209 .mipLevelCount = info -> mipmaps ,
206- .sampleCount = MAX (info -> samples , 1 )
210+ .sampleCount = MAX (info -> samples , 1 ),
211+ .numViewFormats = info -> srgb ? 1 : 0 ,
212+ .viewFormats = & (WGPU_TEXTURE_FORMAT ) { convertFormat (info -> format , info -> srgb ) }
207213 });
208214
209215 if (!texture -> handle ) {
@@ -212,10 +218,15 @@ bool gpu_texture_init(gpu_texture* texture, gpu_texture_info* info) {
212218
213219 wgpu_object_set_label (texture -> handle , info -> label );
214220
215- texture -> format = wgpu_texture_format (texture -> handle );
216- texture -> view = wgpu_texture_create_view_simple (texture -> handle );
221+ gpu_texture_view_info viewInfo = {
222+ .source = texture ,
223+ .type = info -> type ,
224+ .srgb = info -> srgb ,
225+ .layerCount = info -> size [2 ],
226+ .levelCount = info -> mipmaps
227+ };
217228
218- if (!texture -> view ) {
229+ if (!gpu_texture_init_view ( texture , & viewInfo ) ) {
219230 wgpu_object_destroy (texture -> handle );
220231 return false;
221232 }
@@ -259,11 +270,14 @@ bool gpu_texture_init_view(gpu_texture* texture, gpu_texture_view_info* info) {
259270 [GPU_TEXTURE_ARRAY ] = WGPU_TEXTURE_VIEW_DIMENSION_2D_ARRAY
260271 };
261272
262- texture -> handle = 0 ;
263- texture -> format = info -> source -> format ;
273+ if (texture != info -> source ) {
274+ texture -> handle = 0 ;
275+ texture -> format = info -> source -> format ;
276+ texture -> srgb = info -> srgb ;
277+ }
264278
265279 return texture -> view = wgpu_texture_create_view (info -> source -> handle , & (WGpuTextureViewDescriptor ) {
266- .format = texture -> format ,
280+ .format = convertFormat ( texture -> format , texture -> srgb ) ,
267281 .dimension = types [info -> type ],
268282 .baseMipLevel = info -> levelIndex ,
269283 .mipLevelCount = info -> levelCount ,
@@ -320,15 +334,15 @@ bool gpu_surface_acquire(gpu_texture** texture, uint32_t* width, uint32_t* heigh
320334 return true;
321335 }
322336
323- WGPU_TEXTURE_FORMAT format = convertFormat (gpu_surface_get_format (), true);
337+ state .backbuffer .format = gpu_surface_get_format ();
338+ state .backbuffer .srgb = true;
324339 state .backbuffer .handle = wgpu_canvas_context_get_current_texture (state .context );
325340 state .backbuffer .view = wgpu_texture_create_view (state .backbuffer .handle , & (WGpuTextureViewDescriptor ) {
326- .format = format ,
341+ .format = convertFormat ( state . backbuffer . format , true) ,
327342 .dimension = WGPU_TEXTURE_VIEW_DIMENSION_2D ,
328343 .mipLevelCount = 1 ,
329344 .arrayLayerCount = 1
330345 });
331- state .backbuffer .format = format ;
332346 * texture = & state .backbuffer ;
333347 * width = wgpu_texture_width (state .backbuffer .handle );
334348 * height = wgpu_texture_height (state .backbuffer .handle );
@@ -856,7 +870,7 @@ void gpu_render_begin(gpu_stream* stream, gpu_canvas* canvas) {
856870 };
857871 }
858872
859- WGPU_TEXTURE_FORMAT depthFormat = canvas -> depth .texture ? canvas -> depth .texture -> format : WGPU_TEXTURE_FORMAT_INVALID ;
873+ WGPU_TEXTURE_FORMAT depthFormat = canvas -> depth .texture ? convertFormat ( canvas -> depth .texture -> format , false) : WGPU_TEXTURE_FORMAT_INVALID ;
860874 bool stencil = depthFormat == WGPU_TEXTURE_FORMAT_DEPTH24PLUS_STENCIL8 || depthFormat == WGPU_TEXTURE_FORMAT_DEPTH32FLOAT_STENCIL8 ;
861875
862876 WGpuRenderPassDepthStencilAttachment depth = {
@@ -1074,7 +1088,7 @@ void gpu_clear_texture(gpu_stream* stream, gpu_texture* texture, float value[4],
10741088 for (uint32_t i = 0 ; i < levelCount ; i ++ ) {
10751089 for (uint32_t j = 0 ; j < layerCount ; j ++ ) {
10761090 WGpuTextureView view = wgpu_texture_create_view (texture -> handle , & (WGpuTextureViewDescriptor ) {
1077- .format = texture -> format ,
1091+ .format = convertFormat ( texture -> format , texture -> srgb ) ,
10781092 .dimension = WGPU_TEXTURE_VIEW_DIMENSION_2D ,
10791093 .baseMipLevel = level + i ,
10801094 .mipLevelCount = 1 ,
@@ -1191,7 +1205,7 @@ void gpu_blit(gpu_stream* stream, gpu_texture* src, gpu_texture* dst, uint32_t s
11911205 // TODO 3D textures, src uv rect, nearest
11921206 for (uint32_t i = 0 ; i < dstExtent [2 ]; i ++ ) {
11931207 WGpuTextureView srcView = wgpu_texture_create_view (src -> handle , & (WGpuTextureViewDescriptor ) {
1194- .format = src -> format ,
1208+ .format = convertFormat ( src -> format , src -> srgb ) ,
11951209 .dimension = WGPU_TEXTURE_VIEW_DIMENSION_2D ,
11961210 .baseMipLevel = srcOffset [3 ],
11971211 .mipLevelCount = 1 ,
@@ -1200,7 +1214,7 @@ void gpu_blit(gpu_stream* stream, gpu_texture* src, gpu_texture* dst, uint32_t s
12001214 });
12011215
12021216 WGpuTextureView dstView = wgpu_texture_create_view (dst -> handle , & (WGpuTextureViewDescriptor ) {
1203- .format = dst -> format ,
1217+ .format = convertFormat ( dst -> format , dst -> srgb ) ,
12041218 .dimension = WGPU_TEXTURE_VIEW_DIMENSION_2D ,
12051219 .baseMipLevel = dstOffset [3 ],
12061220 .mipLevelCount = 1 ,
@@ -1556,71 +1570,71 @@ static WGPU_TEXTURE_FORMAT convertFormat(gpu_texture_format format, bool srgb) {
15561570 return formats [format ][srgb ];
15571571}
15581572
1559- static uint32_t getRowSize (WGPU_TEXTURE_FORMAT format , uint32_t width ) {
1573+ static uint32_t getRowSize (gpu_texture_format format , uint32_t width ) {
15601574 switch (format ) {
1561- case WGPU_TEXTURE_FORMAT_R8UNORM :
1575+ case GPU_FORMAT_R8 :
15621576 return width ;
1563- case WGPU_TEXTURE_FORMAT_RG8UNORM :
1564- case WGPU_TEXTURE_FORMAT_R16UNORM :
1565- case WGPU_TEXTURE_FORMAT_R16FLOAT :
1566- case WGPU_TEXTURE_FORMAT_DEPTH16UNORM :
1577+ case GPU_FORMAT_RG8 :
1578+ case GPU_FORMAT_R16 :
1579+ case GPU_FORMAT_R16F :
1580+ case GPU_FORMAT_RGB565 :
1581+ case GPU_FORMAT_RGB5A1 :
1582+ case GPU_FORMAT_D16 :
15671583 return width * 2 ;
1568- case WGPU_TEXTURE_FORMAT_RGBA8UNORM :
1569- case WGPU_TEXTURE_FORMAT_RGBA8UNORM_SRGB :
1570- case WGPU_TEXTURE_FORMAT_BGRA8UNORM :
1571- case WGPU_TEXTURE_FORMAT_BGRA8UNORM_SRGB :
1572- case WGPU_TEXTURE_FORMAT_RG16UNORM :
1573- case WGPU_TEXTURE_FORMAT_RG16FLOAT :
1574- case WGPU_TEXTURE_FORMAT_R32FLOAT :
1575- case WGPU_TEXTURE_FORMAT_RG11B10UFLOAT :
1576- case WGPU_TEXTURE_FORMAT_RGB10A2UNORM :
1577- case WGPU_TEXTURE_FORMAT_DEPTH24PLUS :
1578- case WGPU_TEXTURE_FORMAT_DEPTH24PLUS_STENCIL8 :
1579- case WGPU_TEXTURE_FORMAT_DEPTH32FLOAT :
1584+ case GPU_FORMAT_RGBA8 :
1585+ case GPU_FORMAT_BGRA8 :
1586+ case GPU_FORMAT_RG16 :
1587+ case GPU_FORMAT_RG16F :
1588+ case GPU_FORMAT_R32F :
1589+ case GPU_FORMAT_RG11B10F :
1590+ case GPU_FORMAT_RGB10A2 :
1591+ case GPU_FORMAT_D24 :
1592+ case GPU_FORMAT_D24S8 :
1593+ case GPU_FORMAT_D32F :
15801594 return width * 4 ;
1581- case WGPU_TEXTURE_FORMAT_DEPTH32FLOAT_STENCIL8 :
1595+ case GPU_FORMAT_D32FS8 :
15821596 return width * 5 ;
1583- case WGPU_TEXTURE_FORMAT_RGBA16UNORM :
1584- case WGPU_TEXTURE_FORMAT_RGBA16FLOAT :
1585- case WGPU_TEXTURE_FORMAT_RG32FLOAT :
1597+ case GPU_FORMAT_RGBA16 :
1598+ case GPU_FORMAT_RGBA16F :
1599+ case GPU_FORMAT_RG32F :
15861600 return width * 8 ;
1587- case WGPU_TEXTURE_FORMAT_RGBA32FLOAT :
1601+ case GPU_FORMAT_RGBA32F :
15881602 return width * 16 ;
1589- case WGPU_TEXTURE_FORMAT_BC1_RGBA_UNORM : case WGPU_TEXTURE_FORMAT_BC1_RGBA_UNORM_SRGB :
1590- case WGPU_TEXTURE_FORMAT_BC2_RGBA_UNORM : case WGPU_TEXTURE_FORMAT_BC2_RGBA_UNORM_SRGB :
1591- case WGPU_TEXTURE_FORMAT_BC3_RGBA_UNORM : case WGPU_TEXTURE_FORMAT_BC3_RGBA_UNORM_SRGB :
1592- case WGPU_TEXTURE_FORMAT_BC4_R_UNORM : case WGPU_TEXTURE_FORMAT_BC4_R_SNORM :
1593- case WGPU_TEXTURE_FORMAT_BC5_RG_UNORM : case WGPU_TEXTURE_FORMAT_BC5_RG_SNORM :
1594- case WGPU_TEXTURE_FORMAT_BC6H_RGB_UFLOAT : case WGPU_TEXTURE_FORMAT_BC6H_RGB_FLOAT :
1595- case WGPU_TEXTURE_FORMAT_BC7_RGBA_UNORM : case WGPU_TEXTURE_FORMAT_BC7_RGBA_UNORM_SRGB :
1603+ case GPU_FORMAT_BC1 :
1604+ case GPU_FORMAT_BC2 :
1605+ case GPU_FORMAT_BC3 :
1606+ case GPU_FORMAT_BC4U : case GPU_FORMAT_BC4S :
1607+ case GPU_FORMAT_BC5U : case GPU_FORMAT_BC5S :
1608+ case GPU_FORMAT_BC6UF : case GPU_FORMAT_BC6SF :
1609+ case GPU_FORMAT_BC7 :
15961610 return ((width + 3 ) / 4 ) * 16 ;
1597- case WGPU_TEXTURE_FORMAT_ASTC_4X4_UNORM : case WGPU_TEXTURE_FORMAT_ASTC_4X4_UNORM_SRGB :
1611+ case GPU_FORMAT_ASTC_4x4 :
15981612 return ((width + 3 ) / 4 ) * 16 ;
1599- case WGPU_TEXTURE_FORMAT_ASTC_5X4_UNORM : case WGPU_TEXTURE_FORMAT_ASTC_5X4_UNORM_SRGB :
1613+ case GPU_FORMAT_ASTC_5x4 :
16001614 return ((width + 4 ) / 5 ) * 16 ;
1601- case WGPU_TEXTURE_FORMAT_ASTC_5X5_UNORM : case WGPU_TEXTURE_FORMAT_ASTC_5X5_UNORM_SRGB :
1615+ case GPU_FORMAT_ASTC_5x5 :
16021616 return ((width + 4 ) / 5 ) * 16 ;
1603- case WGPU_TEXTURE_FORMAT_ASTC_6X5_UNORM : case WGPU_TEXTURE_FORMAT_ASTC_6X5_UNORM_SRGB :
1617+ case GPU_FORMAT_ASTC_6x5 :
16041618 return ((width + 5 ) / 6 ) * 16 ;
1605- case WGPU_TEXTURE_FORMAT_ASTC_6X6_UNORM : case WGPU_TEXTURE_FORMAT_ASTC_6X6_UNORM_SRGB :
1619+ case GPU_FORMAT_ASTC_6x6 :
16061620 return ((width + 5 ) / 6 ) * 16 ;
1607- case WGPU_TEXTURE_FORMAT_ASTC_8X5_UNORM : case WGPU_TEXTURE_FORMAT_ASTC_8X5_UNORM_SRGB :
1621+ case GPU_FORMAT_ASTC_8x5 :
16081622 return ((width + 7 ) / 8 ) * 16 ;
1609- case WGPU_TEXTURE_FORMAT_ASTC_8X6_UNORM : case WGPU_TEXTURE_FORMAT_ASTC_8X6_UNORM_SRGB :
1623+ case GPU_FORMAT_ASTC_8x6 :
16101624 return ((width + 7 ) / 8 ) * 16 ;
1611- case WGPU_TEXTURE_FORMAT_ASTC_8X8_UNORM : case WGPU_TEXTURE_FORMAT_ASTC_8X8_UNORM_SRGB :
1625+ case GPU_FORMAT_ASTC_8x8 :
16121626 return ((width + 7 ) / 8 ) * 16 ;
1613- case WGPU_TEXTURE_FORMAT_ASTC_10X5_UNORM : case WGPU_TEXTURE_FORMAT_ASTC_10X5_UNORM_SRGB :
1627+ case GPU_FORMAT_ASTC_10x5 :
16141628 return ((width + 9 ) / 10 ) * 16 ;
1615- case WGPU_TEXTURE_FORMAT_ASTC_10X6_UNORM : case WGPU_TEXTURE_FORMAT_ASTC_10X6_UNORM_SRGB :
1629+ case GPU_FORMAT_ASTC_10x6 :
16161630 return ((width + 9 ) / 10 ) * 16 ;
1617- case WGPU_TEXTURE_FORMAT_ASTC_10X8_UNORM : case WGPU_TEXTURE_FORMAT_ASTC_10X8_UNORM_SRGB :
1631+ case GPU_FORMAT_ASTC_10x8 :
16181632 return ((width + 9 ) / 10 ) * 16 ;
1619- case WGPU_TEXTURE_FORMAT_ASTC_10X10_UNORM : case WGPU_TEXTURE_FORMAT_ASTC_10X10_UNORM_SRGB :
1633+ case GPU_FORMAT_ASTC_10x10 :
16201634 return ((width + 9 ) / 10 ) * 16 ;
1621- case WGPU_TEXTURE_FORMAT_ASTC_12X10_UNORM : case WGPU_TEXTURE_FORMAT_ASTC_12X10_UNORM_SRGB :
1635+ case GPU_FORMAT_ASTC_12x10 :
16221636 return ((width + 11 ) / 12 ) * 16 ;
1623- case WGPU_TEXTURE_FORMAT_ASTC_12X12_UNORM : case WGPU_TEXTURE_FORMAT_ASTC_12X12_UNORM_SRGB :
1637+ case GPU_FORMAT_ASTC_12x12 :
16241638 return ((width + 11 ) / 12 ) * 16 ;
16251639 default : return 0 ;
16261640 }
0 commit comments