From a0a7c38f5bfb1ed14d5d6b824ab919df023acb1d Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Sun, 19 Feb 2023 14:01:33 +0100 Subject: sokol_gfx.h: implement sg_query_image_desc() --- sokol_gfx.h | 32 ++++++++++++++++++ tests/functional/sokol_gfx_test.c | 70 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) diff --git a/sokol_gfx.h b/sokol_gfx.h index a19f00c5..c7dc9ddb 100644 --- a/sokol_gfx.h +++ b/sokol_gfx.h @@ -3778,6 +3778,8 @@ typedef struct { sg_wrap wrap_w; sg_border_color border_color; uint32_t max_anisotropy; + float min_lod; + float max_lod; } _sg_image_common_t; _SOKOL_PRIVATE void _sg_image_common_init(_sg_image_common_t* cmn, const sg_image_desc* desc) { @@ -3800,6 +3802,8 @@ _SOKOL_PRIVATE void _sg_image_common_init(_sg_image_common_t* cmn, const sg_imag cmn->wrap_w = desc->wrap_w; cmn->border_color = desc->border_color; cmn->max_anisotropy = desc->max_anisotropy; + cmn->min_lod = desc->min_lod; + cmn->max_lod = desc->max_lod; } typedef struct { @@ -16879,6 +16883,34 @@ SOKOL_API_IMPL sg_buffer_desc sg_query_buffer_desc(sg_buffer buf_id) { return desc; } +SOKOL_API_IMPL sg_image_desc sg_query_image_desc(sg_image img_id) { + SOKOL_ASSERT(_sg.valid); + sg_image_desc desc; + _sg_clear(&desc, sizeof(desc)); + const _sg_image_t* img = _sg_lookup_image(&_sg.pools, img_id.id); + if (img) { + desc.type = img->cmn.type; + desc.render_target = img->cmn.render_target; + desc.width = img->cmn.width; + desc.height = img->cmn.height; + desc.num_slices = img->cmn.num_slices; + desc.num_mipmaps = img->cmn.num_mipmaps; + desc.usage = img->cmn.usage; + desc.pixel_format = img->cmn.pixel_format; + desc.sample_count = img->cmn.sample_count; + desc.min_filter = img->cmn.min_filter; + desc.mag_filter = img->cmn.mag_filter; + desc.wrap_u = img->cmn.wrap_u; + desc.wrap_v = img->cmn.wrap_v; + desc.wrap_w = img->cmn.wrap_w; + desc.border_color = img->cmn.border_color; + desc.max_anisotropy = img->cmn.max_anisotropy; + desc.min_lod = img->cmn.min_lod; + desc.max_lod = img->cmn.max_lod; + } + return desc; +} + SOKOL_API_IMPL sg_buffer_desc sg_query_buffer_defaults(const sg_buffer_desc* desc) { SOKOL_ASSERT(_sg.valid && desc); return _sg_buffer_desc_defaults(desc); diff --git a/tests/functional/sokol_gfx_test.c b/tests/functional/sokol_gfx_test.c index 1f88c60e..a9e0d0e5 100644 --- a/tests/functional/sokol_gfx_test.c +++ b/tests/functional/sokol_gfx_test.c @@ -856,6 +856,76 @@ UTEST(sokol_gfx, query_buffer_desc) { T(b2_desc.data.ptr == 0); T(b2_desc.data.size == 0); + // invalid buffer (returns zeroed desc) + sg_buffer b3 = sg_make_buffer(&(sg_buffer_desc){ + .size = 32, + .usage = SG_USAGE_STREAM, + .label = "bla", + }); + sg_destroy_buffer(b3); + const sg_buffer_desc b3_desc = sg_query_buffer_desc(b3); + T(b3_desc.size == 0); + T(b3_desc.type == 0); + T(b3_desc.usage == 0); + + sg_shutdown(); +} + +UTEST(sokol_gfx, query_image_desc) { + setup(&(sg_desc){0}); + + sg_image i0 = sg_make_image(&(sg_image_desc){ + .width = 256, + .height = 512, + .pixel_format = SG_PIXELFORMAT_R8, + .mag_filter = SG_FILTER_LINEAR, + .wrap_v = SG_WRAP_CLAMP_TO_EDGE, + .usage = SG_USAGE_DYNAMIC, + .border_color = SG_BORDERCOLOR_OPAQUE_WHITE, + .max_anisotropy = 4, + .min_lod = 0.5f, + .max_lod = 0.75f, + }); + const sg_image_desc i0_desc = sg_query_image_desc(i0); + T(i0_desc.type == SG_IMAGETYPE_2D); + T(i0_desc.render_target == false); + T(i0_desc.width == 256); + T(i0_desc.height == 512); + T(i0_desc.num_slices == 1); + T(i0_desc.num_mipmaps == 1); + T(i0_desc.usage == SG_USAGE_DYNAMIC); + T(i0_desc.pixel_format == SG_PIXELFORMAT_R8); + T(i0_desc.sample_count == 1); + T(i0_desc.min_filter == SG_FILTER_NEAREST); + T(i0_desc.mag_filter == SG_FILTER_LINEAR); + T(i0_desc.wrap_u == SG_WRAP_REPEAT); + T(i0_desc.wrap_v == SG_WRAP_CLAMP_TO_EDGE); + T(i0_desc.wrap_w == SG_WRAP_REPEAT); + T(i0_desc.border_color == SG_BORDERCOLOR_OPAQUE_WHITE); + T(i0_desc.max_anisotropy == 4); + T(i0_desc.min_lod == 0.5f); + T(i0_desc.max_lod == 0.75f); + T(i0_desc.data.subimage[0][0].ptr == 0); + T(i0_desc.data.subimage[0][0].size == 0); + T(i0_desc.gl_textures[0] == 0); + T(i0_desc.gl_texture_target == 0); + T(i0_desc.mtl_textures[0] == 0); + T(i0_desc.d3d11_texture == 0); + T(i0_desc.d3d11_shader_resource_view == 0); + T(i0_desc.wgpu_texture == 0); + + sg_destroy_image(i0); + const sg_image_desc i1_desc = sg_query_image_desc(i0); + T(i1_desc.type == 0); + T(i1_desc.render_target == false); + T(i1_desc.width == 0); + T(i1_desc.height == 0); + T(i1_desc.num_slices == 0); + T(i1_desc.num_mipmaps == 0); + T(i1_desc.usage == 0); + T(i1_desc.pixel_format == 0); + T(i1_desc.sample_count == 0); + sg_shutdown(); } -- cgit v1.2.3