aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sokol_gfx.h89
-rw-r--r--tests/functional/sokol_gfx_test.c80
2 files changed, 137 insertions, 32 deletions
diff --git a/sokol_gfx.h b/sokol_gfx.h
index 9d1dc071..63efd906 100644
--- a/sokol_gfx.h
+++ b/sokol_gfx.h
@@ -3859,38 +3859,44 @@ _SOKOL_PRIVATE void _sg_shader_common_init(_sg_shader_common_t* cmn, const sg_sh
}
typedef struct {
+ bool vertex_layout_valid[SG_MAX_SHADERSTAGE_BUFFERS];
+ bool use_instanced_draw;
sg_shader shader_id;
+ sg_layout_desc layout;
+ sg_depth_state depth;
+ sg_stencil_state stencil;
+ int color_count;
+ sg_color_state colors[SG_MAX_COLOR_ATTACHMENTS];
+ sg_primitive_type primitive_type;
sg_index_type index_type;
- bool use_instanced_draw;
- bool vertex_layout_valid[SG_MAX_SHADERSTAGE_BUFFERS];
- int color_attachment_count;
- sg_pixel_format color_formats[SG_MAX_COLOR_ATTACHMENTS];
- sg_pixel_format depth_format;
+ sg_cull_mode cull_mode;
+ sg_face_winding face_winding;
int sample_count;
- float depth_bias;
- float depth_bias_slope_scale;
- float depth_bias_clamp;
sg_color blend_color;
+ bool alpha_to_coverage_enabled;
} _sg_pipeline_common_t;
_SOKOL_PRIVATE void _sg_pipeline_common_init(_sg_pipeline_common_t* cmn, const sg_pipeline_desc* desc) {
SOKOL_ASSERT((desc->color_count >= 1) && (desc->color_count <= SG_MAX_COLOR_ATTACHMENTS));
- cmn->shader_id = desc->shader;
- cmn->index_type = desc->index_type;
- cmn->use_instanced_draw = false;
for (int i = 0; i < SG_MAX_SHADERSTAGE_BUFFERS; i++) {
cmn->vertex_layout_valid[i] = false;
}
- cmn->color_attachment_count = desc->color_count;
- for (int i = 0; i < cmn->color_attachment_count; i++) {
- cmn->color_formats[i] = desc->colors[i].pixel_format;
- }
- cmn->depth_format = desc->depth.pixel_format;
+ cmn->use_instanced_draw = false;
+ cmn->shader_id = desc->shader;
+ cmn->layout = desc->layout;
+ cmn->depth = desc->depth;
+ cmn->stencil = desc->stencil;
+ cmn->color_count = desc->color_count;
+ for (int i = 0; i < desc->color_count; i++) {
+ cmn->colors[i] = desc->colors[i];
+ }
+ cmn->primitive_type = desc->primitive_type;
+ cmn->index_type = desc->index_type;
+ cmn->cull_mode = desc->cull_mode;
+ cmn->face_winding = desc->face_winding;
cmn->sample_count = desc->sample_count;
- cmn->depth_bias = desc->depth.bias;
- cmn->depth_bias_slope_scale = desc->depth.bias_slope_scale;
- cmn->depth_bias_clamp = desc->depth.bias_clamp;
cmn->blend_color = desc->blend_color;
+ cmn->alpha_to_coverage_enabled = desc->alpha_to_coverage_enabled;
}
typedef struct {
@@ -8020,7 +8026,7 @@ _SOKOL_PRIVATE void _sg_gl_apply_pipeline(_sg_pipeline_t* pip) {
}
/* standalone state */
- for (GLuint i = 0; i < (GLuint)pip->cmn.color_attachment_count; i++) {
+ for (GLuint i = 0; i < (GLuint)pip->cmn.color_count; i++) {
if (pip->gl.color_write_mask[i] != _sg.gl.cache.color_write_mask[i]) {
const sg_color_mask cm = pip->gl.color_write_mask[i];
_sg.gl.cache.color_write_mask[i] = cm;
@@ -11844,7 +11850,7 @@ _SOKOL_PRIVATE void _sg_mtl_apply_pipeline(_sg_pipeline_t* pip) {
[_sg.mtl.cmd_encoder setCullMode:pip->mtl.cull_mode];
[_sg.mtl.cmd_encoder setFrontFacingWinding:pip->mtl.winding];
[_sg.mtl.cmd_encoder setStencilReferenceValue:pip->mtl.stencil_ref];
- [_sg.mtl.cmd_encoder setDepthBias:pip->cmn.depth_bias slopeScale:pip->cmn.depth_bias_slope_scale clamp:pip->cmn.depth_bias_clamp];
+ [_sg.mtl.cmd_encoder setDepthBias:pip->cmn.depth.bias slopeScale:pip->cmn.depth.bias_slope_scale clamp:pip->cmn.depth.bias_clamp];
SOKOL_ASSERT(pip->mtl.rps != _SG_MTL_INVALID_SLOT_INDEX);
[_sg.mtl.cmd_encoder setRenderPipelineState:_sg_mtl_id(pip->mtl.rps)];
SOKOL_ASSERT(pip->mtl.dss != _SG_MTL_INVALID_SLOT_INDEX);
@@ -15041,25 +15047,25 @@ _SOKOL_PRIVATE bool _sg_validate_apply_pipeline(sg_pipeline pip_id) {
const _sg_pass_t* pass = _sg_lookup_pass(&_sg.pools, _sg.cur_pass.id);
if (pass) {
/* an offscreen pass */
- _SG_VALIDATE(pip->cmn.color_attachment_count == pass->cmn.num_color_atts, VALIDATE_APIP_ATT_COUNT);
- for (int i = 0; i < pip->cmn.color_attachment_count; i++) {
+ _SG_VALIDATE(pip->cmn.color_count == pass->cmn.num_color_atts, VALIDATE_APIP_ATT_COUNT);
+ for (int i = 0; i < pip->cmn.color_count; i++) {
const _sg_image_t* att_img = _sg_pass_color_image(pass, i);
- _SG_VALIDATE(pip->cmn.color_formats[i] == att_img->cmn.pixel_format, VALIDATE_APIP_COLOR_FORMAT);
+ _SG_VALIDATE(pip->cmn.colors[i].pixel_format == att_img->cmn.pixel_format, VALIDATE_APIP_COLOR_FORMAT);
_SG_VALIDATE(pip->cmn.sample_count == att_img->cmn.sample_count, VALIDATE_APIP_SAMPLE_COUNT);
}
const _sg_image_t* att_dsimg = _sg_pass_ds_image(pass);
if (att_dsimg) {
- _SG_VALIDATE(pip->cmn.depth_format == att_dsimg->cmn.pixel_format, VALIDATE_APIP_DEPTH_FORMAT);
+ _SG_VALIDATE(pip->cmn.depth.pixel_format == att_dsimg->cmn.pixel_format, VALIDATE_APIP_DEPTH_FORMAT);
}
else {
- _SG_VALIDATE(pip->cmn.depth_format == SG_PIXELFORMAT_NONE, VALIDATE_APIP_DEPTH_FORMAT);
+ _SG_VALIDATE(pip->cmn.depth.pixel_format == SG_PIXELFORMAT_NONE, VALIDATE_APIP_DEPTH_FORMAT);
}
}
else {
/* default pass */
- _SG_VALIDATE(pip->cmn.color_attachment_count == 1, VALIDATE_APIP_ATT_COUNT);
- _SG_VALIDATE(pip->cmn.color_formats[0] == _sg.desc.context.color_format, VALIDATE_APIP_COLOR_FORMAT);
- _SG_VALIDATE(pip->cmn.depth_format == _sg.desc.context.depth_format, VALIDATE_APIP_DEPTH_FORMAT);
+ _SG_VALIDATE(pip->cmn.color_count == 1, VALIDATE_APIP_ATT_COUNT);
+ _SG_VALIDATE(pip->cmn.colors[0].pixel_format == _sg.desc.context.color_format, VALIDATE_APIP_COLOR_FORMAT);
+ _SG_VALIDATE(pip->cmn.depth.pixel_format == _sg.desc.context.depth_format, VALIDATE_APIP_DEPTH_FORMAT);
_SG_VALIDATE(pip->cmn.sample_count == _sg.desc.context.sample_count, VALIDATE_APIP_SAMPLE_COUNT);
}
return _sg_validate_end();
@@ -16942,6 +16948,31 @@ SOKOL_API_IMPL sg_shader_desc sg_query_shader_desc(sg_shader shd_id) {
return desc;
}
+SOKOL_API_IMPL sg_pipeline_desc sg_query_pipeline_desc(sg_pipeline pip_id) {
+ SOKOL_ASSERT(_sg.valid);
+ sg_pipeline_desc desc;
+ _sg_clear(&desc, sizeof(desc));
+ const _sg_pipeline_t* pip = _sg_lookup_pipeline(&_sg.pools, pip_id.id);
+ if (pip) {
+ desc.shader = pip->cmn.shader_id;
+ desc.layout = pip->cmn.layout;
+ desc.depth = pip->cmn.depth;
+ desc.stencil = pip->cmn.stencil;
+ desc.color_count = pip->cmn.color_count;
+ for (int i = 0; i < pip->cmn.color_count; i++) {
+ desc.colors[i] = pip->cmn.colors[i];
+ }
+ desc.primitive_type = pip->cmn.primitive_type;
+ desc.index_type = pip->cmn.index_type;
+ desc.cull_mode = pip->cmn.cull_mode;
+ desc.face_winding = pip->cmn.face_winding;
+ desc.sample_count = pip->cmn.sample_count;
+ desc.blend_color = pip->cmn.blend_color;
+ desc.alpha_to_coverage_enabled = pip->cmn.alpha_to_coverage_enabled;
+ }
+ 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 8a8612c6..4ab88e4c 100644
--- a/tests/functional/sokol_gfx_test.c
+++ b/tests/functional/sokol_gfx_test.c
@@ -451,9 +451,9 @@ UTEST(sokol_gfx, make_destroy_pipelines) {
T(pipptr->slot.state == SG_RESOURCESTATE_VALID);
T(pipptr->shader == _sg_lookup_shader(&_sg.pools, desc.shader.id));
T(pipptr->cmn.shader_id.id == desc.shader.id);
- T(pipptr->cmn.color_attachment_count == 1);
- T(pipptr->cmn.color_formats[0] == SG_PIXELFORMAT_RGBA8);
- T(pipptr->cmn.depth_format == SG_PIXELFORMAT_DEPTH_STENCIL);
+ T(pipptr->cmn.color_count == 1);
+ T(pipptr->cmn.colors[0].pixel_format == SG_PIXELFORMAT_RGBA8);
+ T(pipptr->cmn.depth.pixel_format == SG_PIXELFORMAT_DEPTH_STENCIL);
T(pipptr->cmn.sample_count == 1);
T(pipptr->cmn.index_type == SG_INDEXTYPE_NONE);
T(pipptr->cmn.vertex_layout_valid[0]);
@@ -986,6 +986,80 @@ UTEST(sokol_gfx, query_shader_desc) {
sg_shutdown();
}
+UTEST(sokol_gfx, query_pipeline_desc) {
+ setup(&(sg_desc){0});
+
+ sg_shader shd = sg_make_shader(&(sg_shader_desc){0});
+ sg_pipeline p0 = sg_make_pipeline(&(sg_pipeline_desc){
+ .shader = shd,
+ .layout = {
+ .attrs = {
+ [0] = { .format = SG_VERTEXFORMAT_FLOAT4 },
+ [1] = { .format = SG_VERTEXFORMAT_FLOAT2 },
+ }
+ },
+ .label = "p0",
+ });
+
+ const sg_pipeline_desc p0_desc = sg_query_pipeline_desc(p0);
+ T(p0_desc.shader.id == shd.id);
+ T(p0_desc.layout.buffers[0].stride == 24);
+ T(p0_desc.layout.buffers[0].step_func == SG_VERTEXSTEP_PER_VERTEX);
+ T(p0_desc.layout.buffers[0].step_rate == 1);
+ T(p0_desc.layout.buffers[1].stride == 0);
+ T(p0_desc.layout.buffers[1].step_func == 0);
+ T(p0_desc.layout.buffers[1].step_rate == 0);
+ T(p0_desc.layout.attrs[0].format == SG_VERTEXFORMAT_FLOAT4);
+ T(p0_desc.layout.attrs[0].offset == 0);
+ T(p0_desc.layout.attrs[0].buffer_index == 0);
+ T(p0_desc.layout.attrs[1].format == SG_VERTEXFORMAT_FLOAT2);
+ T(p0_desc.layout.attrs[1].offset == 16);
+ T(p0_desc.layout.attrs[1].buffer_index == 0);
+ T(p0_desc.layout.attrs[2].format == 0);
+ T(p0_desc.layout.attrs[2].offset == 0);
+ T(p0_desc.layout.attrs[2].buffer_index == 0);
+ T(p0_desc.depth.pixel_format == SG_PIXELFORMAT_DEPTH_STENCIL);
+ T(p0_desc.depth.compare == SG_COMPAREFUNC_ALWAYS);
+ T(p0_desc.depth.write_enabled == false);
+ T(p0_desc.depth.bias == 0.0f);
+ T(p0_desc.depth.bias_slope_scale == 0.0f);
+ T(p0_desc.depth.bias_clamp == 0.0f);
+ T(p0_desc.stencil.enabled == false);
+ T(p0_desc.stencil.front.compare == SG_COMPAREFUNC_ALWAYS);
+ T(p0_desc.stencil.front.fail_op == SG_STENCILOP_KEEP);
+ T(p0_desc.stencil.front.depth_fail_op == SG_STENCILOP_KEEP);
+ T(p0_desc.stencil.front.pass_op == SG_STENCILOP_KEEP);
+ T(p0_desc.stencil.back.compare == SG_COMPAREFUNC_ALWAYS);
+ T(p0_desc.stencil.back.fail_op == SG_STENCILOP_KEEP);
+ T(p0_desc.stencil.back.depth_fail_op == SG_STENCILOP_KEEP);
+ T(p0_desc.stencil.back.pass_op == SG_STENCILOP_KEEP);
+ T(p0_desc.stencil.read_mask == 0);
+ T(p0_desc.stencil.write_mask == 0);
+ T(p0_desc.stencil.ref == 0);
+ T(p0_desc.color_count == 1);
+ T(p0_desc.colors[0].pixel_format == SG_PIXELFORMAT_RGBA8);
+ T(p0_desc.colors[0].write_mask == SG_COLORMASK_RGBA);
+ T(p0_desc.colors[0].blend.enabled == false);
+ T(p0_desc.colors[0].blend.src_factor_rgb == SG_BLENDFACTOR_ONE);
+ T(p0_desc.colors[0].blend.dst_factor_rgb == SG_BLENDFACTOR_ZERO);
+ T(p0_desc.colors[0].blend.op_rgb == SG_BLENDOP_ADD);
+ T(p0_desc.colors[0].blend.src_factor_alpha == SG_BLENDFACTOR_ONE);
+ T(p0_desc.colors[0].blend.dst_factor_alpha == SG_BLENDFACTOR_ZERO);
+ T(p0_desc.colors[0].blend.op_alpha == SG_BLENDOP_ADD);
+ T(p0_desc.primitive_type == SG_PRIMITIVETYPE_TRIANGLES);
+ T(p0_desc.index_type == SG_INDEXTYPE_NONE);
+ T(p0_desc.cull_mode == SG_CULLMODE_NONE);
+ T(p0_desc.face_winding == SG_FACEWINDING_CW);
+ T(p0_desc.sample_count == 1);
+ T(p0_desc.blend_color.r == 0.0f);
+ T(p0_desc.blend_color.g == 0.0f);
+ T(p0_desc.blend_color.b == 0.0f);
+ T(p0_desc.blend_color.a == 0.0f);
+ T(p0_desc.alpha_to_coverage_enabled == false);
+ T(p0_desc.label == 0);
+ sg_shutdown();
+}
+
UTEST(sokol_gfx, buffer_resource_states) {
setup(&(sg_desc){0});
sg_buffer buf = sg_alloc_buffer();