Skip to content

Commit 4df93b3

Browse files
committed
webgpu: fix srgb;
1 parent e11c043 commit 4df93b3

File tree

2 files changed

+76
-62
lines changed

2 files changed

+76
-62
lines changed

src/core/gpu_web.c

Lines changed: 75 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ struct gpu_buffer {
1212
struct gpu_texture {
1313
WGpuTexture handle;
1414
WGpuTextureView view;
15-
WGPU_TEXTURE_FORMAT format;
15+
gpu_texture_format format;
16+
bool srgb;
1617
};
1718

1819
struct gpu_sampler {
@@ -100,7 +101,7 @@ static struct {
100101
#define MAX(a, b) (a > b ? a : b)
101102

102103
static 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
}

src/modules/graphics/graphics.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9323,7 +9323,7 @@ static bool getBundles(Layout* layout, gpu_bundle** bundles, uint32_t count) {
93239323

93249324
static gpu_texture* createTemporaryTexture(const TextureInfo* size, TextureFormat format, bool srgb, uint32_t samples) {
93259325
gpu_texture_info info = {
9326-
.type = GPU_TEXTURE_ARRAY,
9326+
.type = size->layers > 1 ? GPU_TEXTURE_ARRAY : GPU_TEXTURE_2D,
93279327
.format = (gpu_texture_format) format,
93289328
.srgb = srgb,
93299329
.size = { size->width, size->height, size->layers },

0 commit comments

Comments
 (0)