vk: Add support for dynamic and pipeline color blend state

This commit is contained in:
Kristian Høgsberg
2015-05-26 17:12:18 -07:00
parent 2514ac5547
commit a1d30f867d
3 changed files with 113 additions and 8 deletions

View File

@@ -2490,6 +2490,8 @@ void anv_CmdBindDynamicStateObject(
cmd_buffer->dirty |= ANV_CMD_BUFFER_RS_DIRTY; cmd_buffer->dirty |= ANV_CMD_BUFFER_RS_DIRTY;
break; break;
case VK_STATE_BIND_POINT_COLOR_BLEND: case VK_STATE_BIND_POINT_COLOR_BLEND:
cmd_buffer->cb_state = (struct anv_dynamic_cb_state *) dynamicState;
cmd_buffer->dirty |= ANV_CMD_BUFFER_CB_DIRTY;
break; break;
case VK_STATE_BIND_POINT_DEPTH_STENCIL: case VK_STATE_BIND_POINT_DEPTH_STENCIL:
cmd_buffer->ds_state = (struct anv_dynamic_ds_state *) dynamicState; cmd_buffer->ds_state = (struct anv_dynamic_ds_state *) dynamicState;
@@ -2773,13 +2775,17 @@ anv_cmd_buffer_flush_state(struct anv_cmd_buffer *cmd_buffer)
if (cmd_buffer->dirty & (ANV_CMD_BUFFER_CB_DIRTY | ANV_CMD_BUFFER_DS_DIRTY)) { if (cmd_buffer->dirty & (ANV_CMD_BUFFER_CB_DIRTY | ANV_CMD_BUFFER_DS_DIRTY)) {
struct anv_state state; struct anv_state state;
if (cmd_buffer->ds_state) if (cmd_buffer->ds_state == NULL)
state = anv_cmd_buffer_merge_dynamic(cmd_buffer, state = anv_cmd_buffer_emit_dynamic(cmd_buffer,
cmd_buffer->ds_state->state_color_calc,
cmd_buffer->cb_state->state_color_calc, cmd_buffer->cb_state->state_color_calc,
GEN8_COLOR_CALC_STATE_length, 32); GEN8_COLOR_CALC_STATE_length, 32);
else else if (cmd_buffer->cb_state == NULL)
state = anv_cmd_buffer_emit_dynamic(cmd_buffer, state = anv_cmd_buffer_emit_dynamic(cmd_buffer,
cmd_buffer->ds_state->state_color_calc,
GEN8_COLOR_CALC_STATE_length, 32);
else
state = anv_cmd_buffer_merge_dynamic(cmd_buffer,
cmd_buffer->ds_state->state_color_calc,
cmd_buffer->cb_state->state_color_calc, cmd_buffer->cb_state->state_color_calc,
GEN8_COLOR_CALC_STATE_length, 32); GEN8_COLOR_CALC_STATE_length, 32);

View File

@@ -192,12 +192,12 @@ emit_rs_state(struct anv_pipeline *pipeline, VkPipelineRsStateCreateInfo *info,
.PointWidthSource = info->programPointSize ? Vertex : State, .PointWidthSource = info->programPointSize ? Vertex : State,
}; };
/* bool32_t rasterizerDiscardEnable; */ /* FINISHME: bool32_t rasterizerDiscardEnable; */
GEN8_3DSTATE_SF_pack(NULL, pipeline->state_sf, &sf); GEN8_3DSTATE_SF_pack(NULL, pipeline->state_sf, &sf);
struct GEN8_3DSTATE_RASTER raster = { struct GEN8_3DSTATE_RASTER raster = {
GEN8_3DSTATE_RASTER_header,
.FrontWinding = vk_to_gen_front_face[info->frontFace], .FrontWinding = vk_to_gen_front_face[info->frontFace],
.CullMode = vk_to_gen_cullmode[info->cullMode], .CullMode = vk_to_gen_cullmode[info->cullMode],
.FrontFaceFillMode = vk_to_gen_fillmode[info->fillMode], .FrontFaceFillMode = vk_to_gen_fillmode[info->fillMode],
@@ -218,6 +218,101 @@ emit_rs_state(struct anv_pipeline *pipeline, VkPipelineRsStateCreateInfo *info,
} }
static void
emit_cb_state(struct anv_pipeline *pipeline, VkPipelineCbStateCreateInfo *info)
{
struct anv_device *device = pipeline->device;
static const uint32_t vk_to_gen_logic_op[] = {
[VK_LOGIC_OP_COPY] = LOGICOP_COPY,
[VK_LOGIC_OP_CLEAR] = LOGICOP_CLEAR,
[VK_LOGIC_OP_AND] = LOGICOP_AND,
[VK_LOGIC_OP_AND_REVERSE] = LOGICOP_AND_REVERSE,
[VK_LOGIC_OP_AND_INVERTED] = LOGICOP_AND_INVERTED,
[VK_LOGIC_OP_NOOP] = LOGICOP_NOOP,
[VK_LOGIC_OP_XOR] = LOGICOP_XOR,
[VK_LOGIC_OP_OR] = LOGICOP_OR,
[VK_LOGIC_OP_NOR] = LOGICOP_NOR,
[VK_LOGIC_OP_EQUIV] = LOGICOP_EQUIV,
[VK_LOGIC_OP_INVERT] = LOGICOP_INVERT,
[VK_LOGIC_OP_OR_REVERSE] = LOGICOP_OR_REVERSE,
[VK_LOGIC_OP_COPY_INVERTED] = LOGICOP_COPY_INVERTED,
[VK_LOGIC_OP_OR_INVERTED] = LOGICOP_OR_INVERTED,
[VK_LOGIC_OP_NAND] = LOGICOP_NAND,
[VK_LOGIC_OP_SET] = LOGICOP_SET,
};
static const uint32_t vk_to_gen_blend[] = {
[VK_BLEND_ZERO] = BLENDFACTOR_ZERO,
[VK_BLEND_ONE] = BLENDFACTOR_ONE,
[VK_BLEND_SRC_COLOR] = BLENDFACTOR_SRC_COLOR,
[VK_BLEND_ONE_MINUS_SRC_COLOR] = BLENDFACTOR_INV_SRC_COLOR,
[VK_BLEND_DEST_COLOR] = BLENDFACTOR_DST_COLOR,
[VK_BLEND_ONE_MINUS_DEST_COLOR] = BLENDFACTOR_INV_DST_COLOR,
[VK_BLEND_SRC_ALPHA] = BLENDFACTOR_SRC_ALPHA,
[VK_BLEND_ONE_MINUS_SRC_ALPHA] = BLENDFACTOR_INV_SRC_ALPHA,
[VK_BLEND_DEST_ALPHA] = BLENDFACTOR_DST_ALPHA,
[VK_BLEND_ONE_MINUS_DEST_ALPHA] = BLENDFACTOR_INV_DST_ALPHA,
[VK_BLEND_CONSTANT_COLOR] = BLENDFACTOR_CONST_COLOR,
[VK_BLEND_ONE_MINUS_CONSTANT_COLOR] = BLENDFACTOR_INV_CONST_COLOR,
[VK_BLEND_CONSTANT_ALPHA] = BLENDFACTOR_CONST_ALPHA,
[VK_BLEND_ONE_MINUS_CONSTANT_ALPHA] = BLENDFACTOR_INV_CONST_ALPHA,
[VK_BLEND_SRC_ALPHA_SATURATE] = BLENDFACTOR_SRC_ALPHA_SATURATE,
[VK_BLEND_SRC1_COLOR] = BLENDFACTOR_SRC1_COLOR,
[VK_BLEND_ONE_MINUS_SRC1_COLOR] = BLENDFACTOR_INV_SRC1_COLOR,
[VK_BLEND_SRC1_ALPHA] = BLENDFACTOR_SRC1_ALPHA,
[VK_BLEND_ONE_MINUS_SRC1_ALPHA] = BLENDFACTOR_INV_SRC1_ALPHA,
};
static const uint32_t vk_to_gen_blend_op[] = {
[VK_BLEND_OP_ADD] = BLENDFUNCTION_ADD,
[VK_BLEND_OP_SUBTRACT] = BLENDFUNCTION_SUBTRACT,
[VK_BLEND_OP_REVERSE_SUBTRACT] = BLENDFUNCTION_REVERSE_SUBTRACT,
[VK_BLEND_OP_MIN] = BLENDFUNCTION_MIN,
[VK_BLEND_OP_MAX] = BLENDFUNCTION_MAX,
};
uint32_t num_dwords = 1 + info->attachmentCount * 2;
pipeline->blend_state =
anv_state_pool_alloc(&device->dynamic_state_pool, num_dwords * 4, 64);
struct GEN8_BLEND_STATE blend_state = {
.AlphaToCoverageEnable = info->alphaToCoverageEnable,
};
uint32_t *state = pipeline->blend_state.map;
GEN8_BLEND_STATE_pack(NULL, state, &blend_state);
for (uint32_t i = 0; i < info->attachmentCount; i++) {
const VkPipelineCbAttachmentState *a = &info->pAttachments[i];
struct GEN8_BLEND_STATE_ENTRY entry = {
.LogicOpEnable = info->logicOpEnable,
.LogicOpFunction = vk_to_gen_logic_op[info->logicOp],
.ColorBufferBlendEnable = a->blendEnable,
.PreBlendSourceOnlyClampEnable = false,
.PreBlendColorClampEnable = false,
.PostBlendColorClampEnable = false,
.SourceBlendFactor = vk_to_gen_blend[a->srcBlendColor],
.DestinationBlendFactor = vk_to_gen_blend[a->destBlendColor],
.ColorBlendFunction = vk_to_gen_blend_op[a->blendOpColor],
.SourceAlphaBlendFactor = vk_to_gen_blend[a->srcBlendAlpha],
.DestinationAlphaBlendFactor = vk_to_gen_blend[a->destBlendAlpha],
.AlphaBlendFunction = vk_to_gen_blend_op[a->blendOpAlpha],
.WriteDisableAlpha = !(a->channelWriteMask & VK_CHANNEL_A_BIT),
.WriteDisableRed = !(a->channelWriteMask & VK_CHANNEL_R_BIT),
.WriteDisableGreen = !(a->channelWriteMask & VK_CHANNEL_G_BIT),
.WriteDisableBlue = !(a->channelWriteMask & VK_CHANNEL_B_BIT),
};
GEN8_BLEND_STATE_ENTRY_pack(NULL, state + i * 2 + 1, &entry);
}
anv_batch_emit(&pipeline->batch, GEN8_3DSTATE_BLEND_STATE_POINTERS,
.BlendStatePointer = pipeline->blend_state.offset,
.BlendStatePointerValid = true);
}
static const uint32_t vk_to_gen_compare_op[] = { static const uint32_t vk_to_gen_compare_op[] = {
[VK_COMPARE_OP_NEVER] = COMPAREFUNCTION_NEVER, [VK_COMPARE_OP_NEVER] = COMPAREFUNCTION_NEVER,
[VK_COMPARE_OP_LESS] = COMPAREFUNCTION_LESS, [VK_COMPARE_OP_LESS] = COMPAREFUNCTION_LESS,
@@ -301,6 +396,7 @@ anv_pipeline_create(
VkPipelineIaStateCreateInfo *ia_info = NULL; VkPipelineIaStateCreateInfo *ia_info = NULL;
VkPipelineRsStateCreateInfo *rs_info = NULL; VkPipelineRsStateCreateInfo *rs_info = NULL;
VkPipelineDsStateCreateInfo *ds_info = NULL; VkPipelineDsStateCreateInfo *ds_info = NULL;
VkPipelineCbStateCreateInfo *cb_info = NULL;
VkPipelineVertexInputCreateInfo *vi_info; VkPipelineVertexInputCreateInfo *vi_info;
VkResult result; VkResult result;
uint32_t offset, length; uint32_t offset, length;
@@ -344,7 +440,7 @@ anv_pipeline_create(
anv_finishme("VK_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO"); anv_finishme("VK_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO");
break; break;
case VK_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO: case VK_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO:
anv_finishme("VK_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO"); cb_info = (VkPipelineCbStateCreateInfo *) common;
break; break;
case VK_STRUCTURE_TYPE_PIPELINE_DS_STATE_CREATE_INFO: case VK_STRUCTURE_TYPE_PIPELINE_DS_STATE_CREATE_INFO:
ds_info = (VkPipelineDsStateCreateInfo *) common; ds_info = (VkPipelineDsStateCreateInfo *) common;
@@ -381,6 +477,8 @@ anv_pipeline_create(
if (ds_info) if (ds_info)
emit_ds_state(pipeline, ds_info); emit_ds_state(pipeline, ds_info);
emit_cb_state(pipeline, cb_info);
anv_batch_emit(&pipeline->batch, GEN8_3DSTATE_CLIP, anv_batch_emit(&pipeline->batch, GEN8_3DSTATE_CLIP,
.ClipEnable = true, .ClipEnable = true,
.ViewportXYClipTestEnable = !(extra && extra->disable_viewport)); .ViewportXYClipTestEnable = !(extra && extra->disable_viewport));

View File

@@ -639,6 +639,7 @@ struct anv_pipeline {
uint32_t active_stages; uint32_t active_stages;
struct anv_state_stream program_stream; struct anv_state_stream program_stream;
struct anv_state blend_state;
uint32_t vs_simd8; uint32_t vs_simd8;
uint32_t ps_simd8; uint32_t ps_simd8;
uint32_t ps_simd16; uint32_t ps_simd16;