unsigned h = ctx->fb_state.height;
util_copy_framebuffer_state(&ctx->fb_state, state);
+ unsigned prev_void_alpha_attachments = ctx->gfx_pipeline_state.void_alpha_attachments;
+ ctx->gfx_pipeline_state.void_alpha_attachments = 0;
for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) {
struct pipe_surface *surf = ctx->fb_state.cbufs[i];
- if (surf)
+ if (surf) {
zink_resource(surf->texture)->fb_binds++;
+ ctx->gfx_pipeline_state.void_alpha_attachments |= util_format_has_alpha1(surf->format) ? BITFIELD_BIT(i) : 0;
+ }
}
+ if (ctx->gfx_pipeline_state.void_alpha_attachments != prev_void_alpha_attachments)
+ ctx->gfx_pipeline_state.dirty = true;
if (ctx->fb_state.zsbuf) {
struct pipe_surface *surf = ctx->fb_state.zsbuf;
zink_resource(surf->texture)->fb_binds++;
primitive_state.primitiveRestartEnable = state->primitive_restart ? VK_TRUE : VK_FALSE;
}
+ VkPipelineColorBlendAttachmentState blend_att[PIPE_MAX_COLOR_BUFS];
VkPipelineColorBlendStateCreateInfo blend_state = {0};
blend_state.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
- blend_state.pAttachments = state->blend_state->attachments;
+ if (state->void_alpha_attachments) {
+ for (unsigned i = 0; i < state->num_attachments; i++) {
+ blend_att[i] = state->blend_state->attachments[i];
+ if (state->void_alpha_attachments & BITFIELD_BIT(i))
+ blend_att[i].dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;
+ }
+ blend_state.pAttachments = blend_att;
+ } else
+ blend_state.pAttachments = state->blend_state->attachments;
blend_state.attachmentCount = state->num_attachments;
blend_state.logicOpEnable = state->blend_state->logicop_enable;
blend_state.logicOp = state->blend_state->logicop_func;
struct zink_gfx_pipeline_state {
struct zink_render_pass *render_pass;
+ uint8_t void_alpha_attachments:PIPE_MAX_COLOR_BUFS;
uint32_t num_attachments;
struct zink_blend_state *blend_state;