vk/meta: Factor the guts out of cmd_buffer_clear

This commit is contained in:
Jason Ekstrand 2015-07-02 17:10:37 -07:00
parent beb0e25327
commit 8a6c8177e0
1 changed files with 49 additions and 36 deletions

View File

@ -189,24 +189,21 @@ struct vue_header {
float PointWidth;
};
void
anv_cmd_buffer_clear(struct anv_cmd_buffer *cmd_buffer,
struct anv_render_pass *pass)
struct clear_instance_data {
struct vue_header vue_header;
float color[4];
};
static void
meta_emit_clear(struct anv_cmd_buffer *cmd_buffer,
int num_instances,
struct clear_instance_data *instance_data)
{
struct anv_device *device = cmd_buffer->device;
struct anv_framebuffer *fb = cmd_buffer->framebuffer;
struct anv_saved_state saved_state;
struct anv_state state;
uint32_t size;
struct instance_data {
struct vue_header vue_header;
float color[4];
} *instance_data;
if (pass->num_clear_layers == 0)
return;
const float vertex_data[] = {
/* Rect-list coordinates */
0.0, 0.0,
@ -217,29 +214,13 @@ anv_cmd_buffer_clear(struct anv_cmd_buffer *cmd_buffer,
0.0, 0.0,
};
size = sizeof(vertex_data) + pass->num_clear_layers * sizeof(instance_data[0]);
size = sizeof(vertex_data) + num_instances * sizeof(*instance_data);
state = anv_state_stream_alloc(&cmd_buffer->surface_state_stream, size, 16);
/* Copy in the vertex and instance data */
memcpy(state.map, vertex_data, sizeof(vertex_data));
instance_data = state.map + sizeof(vertex_data);
for (uint32_t i = 0; i < pass->num_layers; i++) {
if (pass->layers[i].color_load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) {
*instance_data++ = (struct instance_data) {
.vue_header = {
.RTAIndex = i,
.ViewportIndex = 0,
.PointWidth = 0.0
},
.color = {
pass->layers[i].clear_color.color.floatColor[0],
pass->layers[i].clear_color.color.floatColor[1],
pass->layers[i].clear_color.color.floatColor[2],
pass->layers[i].clear_color.color.floatColor[3],
}
};
}
}
memcpy(state.map + sizeof(vertex_data), instance_data,
num_instances * sizeof(*instance_data));
struct anv_buffer vertex_buffer = {
.device = cmd_buffer->device,
@ -248,8 +229,6 @@ anv_cmd_buffer_clear(struct anv_cmd_buffer *cmd_buffer,
.offset = state.offset
};
anv_cmd_buffer_save(cmd_buffer, &saved_state);
anv_CmdBindVertexBuffers((VkCmdBuffer) cmd_buffer, 0, 2,
(VkBuffer[]) {
(VkBuffer) &vertex_buffer,
@ -286,11 +265,45 @@ anv_cmd_buffer_clear(struct anv_cmd_buffer *cmd_buffer,
VK_STATE_BIND_POINT_COLOR_BLEND,
device->meta_state.shared.cb_state);
anv_CmdDraw((VkCmdBuffer) cmd_buffer, 0, 3, 0, pass->num_clear_layers);
anv_CmdDraw((VkCmdBuffer) cmd_buffer, 0, 3, 0, num_instances);
}
void
anv_cmd_buffer_clear(struct anv_cmd_buffer *cmd_buffer,
struct anv_render_pass *pass)
{
struct anv_saved_state saved_state;
int num_clear_layers = 0;
struct clear_instance_data instance_data[MAX_RTS];
for (uint32_t i = 0; i < pass->num_layers; i++) {
if (pass->layers[i].color_load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) {
instance_data[num_clear_layers++] = (struct clear_instance_data) {
.vue_header = {
.RTAIndex = i,
.ViewportIndex = 0,
.PointWidth = 0.0
},
.color = {
pass->layers[i].clear_color.color.floatColor[0],
pass->layers[i].clear_color.color.floatColor[1],
pass->layers[i].clear_color.color.floatColor[2],
pass->layers[i].clear_color.color.floatColor[3],
}
};
}
}
if (num_clear_layers == 0)
return;
anv_cmd_buffer_save(cmd_buffer, &saved_state);
meta_emit_clear(cmd_buffer, num_clear_layers, instance_data);
/* Restore API state */
anv_cmd_buffer_restore(cmd_buffer, &saved_state);
}
static void