|
35 | 35 | #include "betsy_bc1.h" |
36 | 36 |
|
37 | 37 | #include "bc1.glsl.gen.h" |
| 38 | +#include "bc4.glsl.gen.h" |
38 | 39 | #include "bc6h.glsl.gen.h" |
39 | 40 |
|
40 | 41 | static Mutex betsy_mutex; |
@@ -165,6 +166,10 @@ static String get_shader_name(BetsyFormat p_format) { |
165 | 166 | case BETSY_FORMAT_BC3: |
166 | 167 | return "BC3"; |
167 | 168 |
|
| 169 | + case BETSY_FORMAT_BC4_SIGNED: |
| 170 | + case BETSY_FORMAT_BC4_UNSIGNED: |
| 171 | + return "BC4"; |
| 172 | + |
168 | 173 | case BETSY_FORMAT_BC6_SIGNED: |
169 | 174 | case BETSY_FORMAT_BC6_UNSIGNED: |
170 | 175 | return "BC6"; |
@@ -202,6 +207,12 @@ Error BetsyCompressor::_compress(BetsyFormat p_format, Image *r_img) { |
202 | 207 | dest_format = Image::FORMAT_DXT1; |
203 | 208 | break; |
204 | 209 |
|
| 210 | + case BETSY_FORMAT_BC4_UNSIGNED: |
| 211 | + version = "unsigned"; |
| 212 | + dst_rd_format = RD::DATA_FORMAT_R32G32_UINT; |
| 213 | + dest_format = Image::FORMAT_RGTC_R; |
| 214 | + break; |
| 215 | + |
205 | 216 | case BETSY_FORMAT_BC6_SIGNED: |
206 | 217 | version = "signed"; |
207 | 218 | dst_rd_format = RD::DATA_FORMAT_R32G32B32A32_UINT; |
@@ -235,8 +246,13 @@ Error BetsyCompressor::_compress(BetsyFormat p_format, Image *r_img) { |
235 | 246 | err = source->parse_versions_from_text(bc1_shader_glsl); |
236 | 247 | break; |
237 | 248 |
|
238 | | - case BETSY_FORMAT_BC6_UNSIGNED: |
| 249 | + case BETSY_FORMAT_BC4_SIGNED: |
| 250 | + case BETSY_FORMAT_BC4_UNSIGNED: |
| 251 | + err = source->parse_versions_from_text(bc4_shader_glsl); |
| 252 | + break; |
| 253 | + |
239 | 254 | case BETSY_FORMAT_BC6_SIGNED: |
| 255 | + case BETSY_FORMAT_BC6_UNSIGNED: |
240 | 256 | err = source->parse_versions_from_text(bc6h_shader_glsl); |
241 | 257 | break; |
242 | 258 |
|
@@ -430,26 +446,45 @@ Error BetsyCompressor::_compress(BetsyFormat p_format, Image *r_img) { |
430 | 446 | compress_rd->compute_list_bind_compute_pipeline(compute_list, shader.pipeline); |
431 | 447 | compress_rd->compute_list_bind_uniform_set(compute_list, uniform_set, 0); |
432 | 448 |
|
433 | | - if (dest_format == Image::FORMAT_BPTC_RGBFU || dest_format == Image::FORMAT_BPTC_RGBF) { |
434 | | - BC6PushConstant push_constant; |
435 | | - push_constant.sizeX = 1.0f / width; |
436 | | - push_constant.sizeY = 1.0f / height; |
437 | | - push_constant.padding[0] = 0; |
438 | | - push_constant.padding[1] = 0; |
439 | | - |
440 | | - compress_rd->compute_list_set_push_constant(compute_list, &push_constant, sizeof(BC6PushConstant)); |
441 | | - |
442 | | - } else { |
443 | | - BC1PushConstant push_constant; |
444 | | - push_constant.num_refines = 2; |
445 | | - push_constant.padding[0] = 0; |
446 | | - push_constant.padding[1] = 0; |
447 | | - push_constant.padding[2] = 0; |
448 | | - |
449 | | - compress_rd->compute_list_set_push_constant(compute_list, &push_constant, sizeof(BC1PushConstant)); |
| 449 | + switch (dest_format) { |
| 450 | + case Image::FORMAT_BPTC_RGBFU: |
| 451 | + case Image::FORMAT_BPTC_RGBF: { |
| 452 | + BC6PushConstant push_constant; |
| 453 | + push_constant.sizeX = 1.0f / width; |
| 454 | + push_constant.sizeY = 1.0f / height; |
| 455 | + push_constant.padding[0] = 0; |
| 456 | + push_constant.padding[1] = 0; |
| 457 | + |
| 458 | + compress_rd->compute_list_set_push_constant(compute_list, &push_constant, sizeof(BC6PushConstant)); |
| 459 | + compress_rd->compute_list_dispatch(compute_list, get_next_multiple(width, 32) / 32, get_next_multiple(height, 32) / 32, 1); |
| 460 | + } break; |
| 461 | + |
| 462 | + case Image::FORMAT_DXT1: { |
| 463 | + BC1PushConstant push_constant; |
| 464 | + push_constant.num_refines = 2; |
| 465 | + push_constant.padding[0] = 0; |
| 466 | + push_constant.padding[1] = 0; |
| 467 | + push_constant.padding[2] = 0; |
| 468 | + |
| 469 | + compress_rd->compute_list_set_push_constant(compute_list, &push_constant, sizeof(BC1PushConstant)); |
| 470 | + compress_rd->compute_list_dispatch(compute_list, get_next_multiple(width, 32) / 32, get_next_multiple(height, 32) / 32, 1); |
| 471 | + } break; |
| 472 | + |
| 473 | + case Image::FORMAT_RGTC_R: { |
| 474 | + BC4PushConstant push_constant; |
| 475 | + push_constant.channel_idx = 0; |
| 476 | + push_constant.padding[0] = 0; |
| 477 | + push_constant.padding[1] = 0; |
| 478 | + push_constant.padding[2] = 0; |
| 479 | + |
| 480 | + compress_rd->compute_list_set_push_constant(compute_list, &push_constant, sizeof(BC4PushConstant)); |
| 481 | + compress_rd->compute_list_dispatch(compute_list, 1, get_next_multiple(width, 16) / 16, get_next_multiple(height, 16) / 16); |
| 482 | + } break; |
| 483 | + |
| 484 | + default: { |
| 485 | + } break; |
450 | 486 | } |
451 | 487 |
|
452 | | - compress_rd->compute_list_dispatch(compute_list, get_next_multiple(width, 32) / 32, get_next_multiple(height, 32) / 32, 1); |
453 | 488 | compress_rd->compute_list_end(); |
454 | 489 |
|
455 | 490 | compress_rd->submit(); |
@@ -511,13 +546,14 @@ Error _betsy_compress_s3tc(Image *r_img, Image::UsedChannels p_channels) { |
511 | 546 |
|
512 | 547 | switch (p_channels) { |
513 | 548 | case Image::USED_CHANNELS_RGB: |
514 | | - result = betsy->compress(BETSY_FORMAT_BC1_DITHER, r_img); |
515 | | - break; |
516 | | - |
517 | 549 | case Image::USED_CHANNELS_L: |
518 | 550 | result = betsy->compress(BETSY_FORMAT_BC1, r_img); |
519 | 551 | break; |
520 | 552 |
|
| 553 | + case Image::USED_CHANNELS_R: |
| 554 | + result = betsy->compress(BETSY_FORMAT_BC4_UNSIGNED, r_img); |
| 555 | + break; |
| 556 | + |
521 | 557 | default: |
522 | 558 | break; |
523 | 559 | } |
|
0 commit comments