|
@@ -35,6 +35,7 @@
|
|
|
#include "betsy_bc1.h"
|
|
|
|
|
|
#include "bc1.glsl.gen.h"
|
|
|
+#include "bc4.glsl.gen.h"
|
|
|
#include "bc6h.glsl.gen.h"
|
|
|
|
|
|
static Mutex betsy_mutex;
|
|
@@ -165,6 +166,10 @@ static String get_shader_name(BetsyFormat p_format) {
|
|
|
case BETSY_FORMAT_BC3:
|
|
|
return "BC3";
|
|
|
|
|
|
+ case BETSY_FORMAT_BC4_SIGNED:
|
|
|
+ case BETSY_FORMAT_BC4_UNSIGNED:
|
|
|
+ return "BC4";
|
|
|
+
|
|
|
case BETSY_FORMAT_BC6_SIGNED:
|
|
|
case BETSY_FORMAT_BC6_UNSIGNED:
|
|
|
return "BC6";
|
|
@@ -202,6 +207,12 @@ Error BetsyCompressor::_compress(BetsyFormat p_format, Image *r_img) {
|
|
|
dest_format = Image::FORMAT_DXT1;
|
|
|
break;
|
|
|
|
|
|
+ case BETSY_FORMAT_BC4_UNSIGNED:
|
|
|
+ version = "unsigned";
|
|
|
+ dst_rd_format = RD::DATA_FORMAT_R32G32_UINT;
|
|
|
+ dest_format = Image::FORMAT_RGTC_R;
|
|
|
+ break;
|
|
|
+
|
|
|
case BETSY_FORMAT_BC6_SIGNED:
|
|
|
version = "signed";
|
|
|
dst_rd_format = RD::DATA_FORMAT_R32G32B32A32_UINT;
|
|
@@ -235,8 +246,13 @@ Error BetsyCompressor::_compress(BetsyFormat p_format, Image *r_img) {
|
|
|
err = source->parse_versions_from_text(bc1_shader_glsl);
|
|
|
break;
|
|
|
|
|
|
- case BETSY_FORMAT_BC6_UNSIGNED:
|
|
|
+ case BETSY_FORMAT_BC4_SIGNED:
|
|
|
+ case BETSY_FORMAT_BC4_UNSIGNED:
|
|
|
+ err = source->parse_versions_from_text(bc4_shader_glsl);
|
|
|
+ break;
|
|
|
+
|
|
|
case BETSY_FORMAT_BC6_SIGNED:
|
|
|
+ case BETSY_FORMAT_BC6_UNSIGNED:
|
|
|
err = source->parse_versions_from_text(bc6h_shader_glsl);
|
|
|
break;
|
|
|
|
|
@@ -430,26 +446,45 @@ Error BetsyCompressor::_compress(BetsyFormat p_format, Image *r_img) {
|
|
|
compress_rd->compute_list_bind_compute_pipeline(compute_list, shader.pipeline);
|
|
|
compress_rd->compute_list_bind_uniform_set(compute_list, uniform_set, 0);
|
|
|
|
|
|
- if (dest_format == Image::FORMAT_BPTC_RGBFU || dest_format == Image::FORMAT_BPTC_RGBF) {
|
|
|
- BC6PushConstant push_constant;
|
|
|
- push_constant.sizeX = 1.0f / width;
|
|
|
- push_constant.sizeY = 1.0f / height;
|
|
|
- push_constant.padding[0] = 0;
|
|
|
- push_constant.padding[1] = 0;
|
|
|
-
|
|
|
- compress_rd->compute_list_set_push_constant(compute_list, &push_constant, sizeof(BC6PushConstant));
|
|
|
-
|
|
|
- } else {
|
|
|
- BC1PushConstant push_constant;
|
|
|
- push_constant.num_refines = 2;
|
|
|
- push_constant.padding[0] = 0;
|
|
|
- push_constant.padding[1] = 0;
|
|
|
- push_constant.padding[2] = 0;
|
|
|
-
|
|
|
- compress_rd->compute_list_set_push_constant(compute_list, &push_constant, sizeof(BC1PushConstant));
|
|
|
+ switch (dest_format) {
|
|
|
+ case Image::FORMAT_BPTC_RGBFU:
|
|
|
+ case Image::FORMAT_BPTC_RGBF: {
|
|
|
+ BC6PushConstant push_constant;
|
|
|
+ push_constant.sizeX = 1.0f / width;
|
|
|
+ push_constant.sizeY = 1.0f / height;
|
|
|
+ push_constant.padding[0] = 0;
|
|
|
+ push_constant.padding[1] = 0;
|
|
|
+
|
|
|
+ compress_rd->compute_list_set_push_constant(compute_list, &push_constant, sizeof(BC6PushConstant));
|
|
|
+ compress_rd->compute_list_dispatch(compute_list, get_next_multiple(width, 32) / 32, get_next_multiple(height, 32) / 32, 1);
|
|
|
+ } break;
|
|
|
+
|
|
|
+ case Image::FORMAT_DXT1: {
|
|
|
+ BC1PushConstant push_constant;
|
|
|
+ push_constant.num_refines = 2;
|
|
|
+ push_constant.padding[0] = 0;
|
|
|
+ push_constant.padding[1] = 0;
|
|
|
+ push_constant.padding[2] = 0;
|
|
|
+
|
|
|
+ compress_rd->compute_list_set_push_constant(compute_list, &push_constant, sizeof(BC1PushConstant));
|
|
|
+ compress_rd->compute_list_dispatch(compute_list, get_next_multiple(width, 32) / 32, get_next_multiple(height, 32) / 32, 1);
|
|
|
+ } break;
|
|
|
+
|
|
|
+ case Image::FORMAT_RGTC_R: {
|
|
|
+ BC4PushConstant push_constant;
|
|
|
+ push_constant.channel_idx = 0;
|
|
|
+ push_constant.padding[0] = 0;
|
|
|
+ push_constant.padding[1] = 0;
|
|
|
+ push_constant.padding[2] = 0;
|
|
|
+
|
|
|
+ compress_rd->compute_list_set_push_constant(compute_list, &push_constant, sizeof(BC4PushConstant));
|
|
|
+ compress_rd->compute_list_dispatch(compute_list, 1, get_next_multiple(width, 16) / 16, get_next_multiple(height, 16) / 16);
|
|
|
+ } break;
|
|
|
+
|
|
|
+ default: {
|
|
|
+ } break;
|
|
|
}
|
|
|
|
|
|
- compress_rd->compute_list_dispatch(compute_list, get_next_multiple(width, 32) / 32, get_next_multiple(height, 32) / 32, 1);
|
|
|
compress_rd->compute_list_end();
|
|
|
|
|
|
compress_rd->submit();
|
|
@@ -511,13 +546,14 @@ Error _betsy_compress_s3tc(Image *r_img, Image::UsedChannels p_channels) {
|
|
|
|
|
|
switch (p_channels) {
|
|
|
case Image::USED_CHANNELS_RGB:
|
|
|
- result = betsy->compress(BETSY_FORMAT_BC1_DITHER, r_img);
|
|
|
- break;
|
|
|
-
|
|
|
case Image::USED_CHANNELS_L:
|
|
|
result = betsy->compress(BETSY_FORMAT_BC1, r_img);
|
|
|
break;
|
|
|
|
|
|
+ case Image::USED_CHANNELS_R:
|
|
|
+ result = betsy->compress(BETSY_FORMAT_BC4_UNSIGNED, r_img);
|
|
|
+ break;
|
|
|
+
|
|
|
default:
|
|
|
break;
|
|
|
}
|