VK_EXT_discard_rectangles DONE (radv)
VK_EXT_display_control DONE (anv, hasvk, radv, tu)
VK_EXT_display_surface_counter DONE (anv, lvp, radv, tu)
- VK_EXT_dynamic_rendering_unused_attachments DONE (anv, radv, vn)
+ VK_EXT_dynamic_rendering_unused_attachments DONE (anv, nvk, radv, vn)
VK_EXT_extended_dynamic_state3 DONE (anv, lvp, nvk, radv, tu)
VK_EXT_external_memory_acquire_unmodified DONE (radv)
VK_EXT_external_memory_dma_buf DONE (anv, hasvk, nvk, pvr, radv, tu, v3dv, vn)
emit_pipeline_cb_state(struct nv_push *p,
const struct vk_color_blend_state *cb)
{
- bool indep_color_masks = true;
P_IMMD(p, NV9097, SET_BLEND_STATE_PER_TARGET, ENABLE_TRUE);
for (uint32_t a = 0; a < cb->attachment_count; a++) {
vk_to_nv9097_blend_factor(att->src_alpha_blend_factor));
P_NV9097_SET_BLEND_PER_TARGET_ALPHA_DEST_COEFF(p, a,
vk_to_nv9097_blend_factor(att->dst_alpha_blend_factor));
+ }
+}
+static void
+emit_pipeline_ct_write_state(struct nv_push *p,
+ const struct vk_color_blend_state *cb,
+ const struct vk_render_pass_state *rp)
+{
+ uint32_t att_write_masks[8] = {};
+ uint32_t att_count = 0;
+
+ if (rp != NULL) {
+ att_count = rp->color_attachment_count;
+ for (uint32_t a = 0; a < rp->color_attachment_count; a++) {
+ VkFormat att_format = rp->color_attachment_formats[a];
+ att_write_masks[a] = att_format == VK_FORMAT_UNDEFINED ? 0 : 0xf;
+ }
+ }
+
+ if (cb != NULL) {
+ assert(cb->attachment_count == att_count);
+ for (uint32_t a = 0; a < cb->attachment_count; a++)
+ att_write_masks[a] &= cb->attachments[a].write_mask;
+ }
+
+ bool indep_color_masks = true;
+ for (uint32_t a = 0; a < att_count; a++) {
P_IMMD(p, NV9097, SET_CT_WRITE(a), {
- .r_enable = (att->write_mask & BITFIELD_BIT(0)) != 0,
- .g_enable = (att->write_mask & BITFIELD_BIT(1)) != 0,
- .b_enable = (att->write_mask & BITFIELD_BIT(2)) != 0,
- .a_enable = (att->write_mask & BITFIELD_BIT(3)) != 0,
+ .r_enable = (att_write_masks[a] & BITFIELD_BIT(0)) != 0,
+ .g_enable = (att_write_masks[a] & BITFIELD_BIT(1)) != 0,
+ .b_enable = (att_write_masks[a] & BITFIELD_BIT(2)) != 0,
+ .a_enable = (att_write_masks[a] & BITFIELD_BIT(3)) != 0,
});
- if (att->write_mask != cb->attachments[0].write_mask)
+ if (att_write_masks[a] != att_write_masks[0])
indep_color_masks = false;
}
if (state.rs) emit_pipeline_rs_state(&push, state.rs);
if (state.ms) emit_pipeline_ms_state(&push, state.ms, force_max_samples);
if (state.cb) emit_pipeline_cb_state(&push, state.cb);
+ emit_pipeline_ct_write_state(&push, state.cb, state.rp);
pipeline->push_dw_count = nv_push_dw_count(&push);
.EXT_depth_clip_control = true,
.EXT_depth_clip_enable = true,
.EXT_descriptor_indexing = true,
+ .EXT_dynamic_rendering_unused_attachments = true,
.EXT_extended_dynamic_state = true,
.EXT_extended_dynamic_state2 = true,
.EXT_extended_dynamic_state3 = true,
/* VK_EXT_depth_clip_enable */
.depthClipEnable = true,
+ /* VK_EXT_dynamic_rendering_unused_attachments */
+ .dynamicRenderingUnusedAttachments = true,
+
/* VK_EXT_extended_dynamic_state */
.extendedDynamicState = true,