IMB: Refactor util_gpu.c to not expose enum getters

This was causing compiler error on MSVC and is not a good idea
in general.
This commit is contained in:
Clément Foucault 2020-07-30 16:40:20 +02:00
parent 008ccacdfc
commit 55401fbb3d
Notes: blender-bot 2023-02-13 21:33:56 +01:00
Referenced by issue #79605, Material Preview Icons Lost Transparency For Their Background
3 changed files with 79 additions and 38 deletions

View File

@ -178,12 +178,9 @@ static GPUTexture *gpu_texture_create_tile_array(Image *ima, ImBuf *main_ibuf)
}
const bool use_high_bitdepth = (ima->flag & IMA_HIGH_BITDEPTH);
eGPUDataFormat data_format;
eGPUTextureFormat tex_format;
IMB_gpu_get_format(main_ibuf, use_high_bitdepth, &data_format, &tex_format);
/* Create Texture. */
GPUTexture *tex = GPU_texture_create_nD(
arraywidth, arrayheight, arraylayers, 2, NULL, tex_format, data_format, 0, false, NULL);
/* Create Texture without content. */
GPUTexture *tex = IMB_touch_gpu_texture(
main_ibuf, arraywidth, arrayheight, arraylayers, use_high_bitdepth);
GPU_texture_bind(tex, 0);
@ -203,20 +200,15 @@ static GPUTexture *gpu_texture_create_tile_array(Image *ima, ImBuf *main_ibuf)
ImBuf *ibuf = BKE_image_acquire_ibuf(ima, &iuser, NULL);
if (ibuf) {
const bool needs_scale = (ibuf->x != tilesize[0] || ibuf->y != tilesize[1]);
const bool compress_as_srgb = (tex_format == GPU_SRGB8_A8);
const bool store_premultiplied = ibuf->rect_float ? (ima->alpha_mode != IMA_ALPHA_STRAIGHT) :
(ima->alpha_mode == IMA_ALPHA_PREMUL);
bool freebuf = false;
void *pixeldata = IMB_gpu_get_data(
ibuf, needs_scale, tilesize, compress_as_srgb, store_premultiplied, &freebuf);
GPU_texture_update_sub(
tex, data_format, pixeldata, UNPACK2(tileoffset), tilelayer, UNPACK2(tilesize), 1);
if (freebuf) {
MEM_SAFE_FREE(pixeldata);
}
IMB_update_gpu_texture_sub(tex,
ibuf,
UNPACK2(tileoffset),
tilelayer,
UNPACK2(tilesize),
use_high_bitdepth,
store_premultiplied);
}
BKE_image_release_ibuf(ima, ibuf, NULL);

View File

@ -737,19 +737,20 @@ const char *IMB_ffmpeg_last_error(void);
*
* \attention defined in util_gpu.c
*/
void IMB_gpu_get_format(const struct ImBuf *ibuf,
bool high_bitdepth,
uint *r_data_format,
uint *r_texture_format);
void *IMB_gpu_get_data(const struct ImBuf *ibuf,
const bool do_rescale,
const int rescale_size[2],
const bool compress_as_srgb,
const bool store_premultiplied,
bool *r_freedata);
struct GPUTexture *IMB_create_gpu_texture(struct ImBuf *ibuf,
bool use_high_bitdepth,
bool use_premult);
struct GPUTexture *IMB_touch_gpu_texture(
struct ImBuf *ibuf, int w, int h, int layers, bool use_high_bitdepth);
void IMB_update_gpu_texture_sub(struct GPUTexture *tex,
struct ImBuf *ibuf,
int x,
int y,
int z,
int w,
int h,
bool use_high_bitdepth,
bool use_premult);
/**
*

View File

@ -39,10 +39,10 @@
/* gpu ibuf utils */
void IMB_gpu_get_format(const ImBuf *ibuf,
bool high_bitdepth,
uint *r_data_format /* eGPUDataFormat */,
uint *r_texture_format /* eGPUTextureFormat */)
static void IMB_gpu_get_format(const ImBuf *ibuf,
bool high_bitdepth,
eGPUDataFormat *r_data_format,
eGPUTextureFormat *r_texture_format)
{
const bool float_rect = (ibuf->rect_float != NULL);
const bool use_srgb = (!IMB_colormanagement_space_is_data(ibuf->rect_colorspace) &&
@ -88,12 +88,12 @@ static bool IMB_gpu_get_compressed_format(const ImBuf *ibuf, eGPUTextureFormat *
* Apply colormanagement and scale buffer if needed.
* *r_freedata is set to true if the returned buffer need to be manually freed.
**/
void *IMB_gpu_get_data(const ImBuf *ibuf,
const bool do_rescale,
const int rescale_size[2],
const bool compress_as_srgb,
const bool store_premultiplied,
bool *r_freedata)
static void *IMB_gpu_get_data(const ImBuf *ibuf,
const bool do_rescale,
const int rescale_size[2],
const bool compress_as_srgb,
const bool store_premultiplied,
bool *r_freedata)
{
const bool is_float_rect = (ibuf->rect_float != NULL);
void *data_rect = (is_float_rect) ? (void *)ibuf->rect_float : (void *)ibuf->rect;
@ -157,6 +157,54 @@ void *IMB_gpu_get_data(const ImBuf *ibuf,
return data_rect;
}
/* The ibuf is only here to detect the storage type. The produced texture will have undefined
* content. It will need to be populated by using IMB_update_gpu_texture_sub(). */
GPUTexture *IMB_touch_gpu_texture(ImBuf *ibuf, int w, int h, int layers, bool use_high_bitdepth)
{
eGPUDataFormat data_format;
eGPUTextureFormat tex_format;
IMB_gpu_get_format(ibuf, use_high_bitdepth, &data_format, &tex_format);
GPUTexture *tex = GPU_texture_create_nD(
w, h, layers, 2, NULL, tex_format, data_format, 0, false, NULL);
GPU_texture_anisotropic_filter(tex, true);
return tex;
}
/* Will update a GPUTexture using the content of the ImBuf. Only one layer will be updated.
* Will resize the ibuf if needed.
* z is the layer to update. Unused if the texture is 2D. */
void IMB_update_gpu_texture_sub(GPUTexture *tex,
ImBuf *ibuf,
int x,
int y,
int z,
int w,
int h,
bool use_high_bitdepth,
bool use_premult)
{
const bool do_rescale = (ibuf->x != w || ibuf->y != h);
int size[2] = {w, h};
eGPUDataFormat data_format;
eGPUTextureFormat tex_format;
IMB_gpu_get_format(ibuf, use_high_bitdepth, &data_format, &tex_format);
const bool compress_as_srgb = (tex_format == GPU_SRGB8_A8);
bool freebuf = false;
void *data = IMB_gpu_get_data(ibuf, do_rescale, size, compress_as_srgb, use_premult, &freebuf);
/* Update Texture. */
GPU_texture_update_sub(tex, data_format, data, x, y, z, w, h, 1);
if (freebuf) {
MEM_freeN(data);
}
}
GPUTexture *IMB_create_gpu_texture(ImBuf *ibuf, bool use_high_bitdepth, bool use_premult)
{
GPUTexture *tex = NULL;