v3dv/cmd_buffer: emit Viewport packets

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
This commit is contained in:
Alejandro Piñeiro 2019-12-27 16:13:31 +01:00 committed by Marge Bot
parent 7bfe1db93c
commit 29b6e29378
1 changed files with 39 additions and 0 deletions

View File

@ -1111,6 +1111,41 @@ emit_scissor(struct v3dv_cmd_buffer *cmd_buffer)
emit_clip_window(cmd_buffer, &clip_window);
}
static void
emit_viewport(struct v3dv_cmd_buffer *cmd_buffer)
{
struct v3dv_dynamic_state *dynamic = &cmd_buffer->state.dynamic;
float vptranslate[3];
float vpscale[3];
/* FIXME: right now we only support one viewport. viewporst[0] would work
* now, would need to change if we allow multiple viewports
*/
get_viewport_xform(&dynamic->viewport.viewports[0],
vpscale, vptranslate);
cl_emit(&cmd_buffer->bcl, CLIPPER_XY_SCALING, clip) {
clip.viewport_half_width_in_1_256th_of_pixel = vpscale[0] * 256.0f;
clip.viewport_half_height_in_1_256th_of_pixel = vpscale[1] * 256.0f;
}
cl_emit(&cmd_buffer->bcl, CLIPPER_Z_SCALE_AND_OFFSET, clip) {
clip.viewport_z_offset_zc_to_zs = vptranslate[2];
clip.viewport_z_scale_zc_to_zs = vpscale[2];
}
cl_emit(&cmd_buffer->bcl, CLIPPER_Z_MIN_MAX_CLIPPING_PLANES, clip) {
float z1 = (vptranslate[2] - vpscale[2]);
float z2 = (vptranslate[2] + vpscale[2]);
clip.minimum_zw = MIN2(z1, z2);
clip.maximum_zw = MAX2(z1, z2);
}
cl_emit(&cmd_buffer->bcl, VIEWPORT_OFFSET, vp) {
vp.viewport_centre_x_coordinate = vptranslate[0];
vp.viewport_centre_y_coordinate = vptranslate[1];
}
}
static void
cmd_buffer_emit_state(struct v3dv_cmd_buffer *cmd_buffer)
{
@ -1125,6 +1160,10 @@ cmd_buffer_emit_state(struct v3dv_cmd_buffer *cmd_buffer)
emit_scissor(cmd_buffer);
}
if (states & (V3DV_CMD_DIRTY_DYNAMIC_VIEWPORT)) {
emit_viewport(cmd_buffer);
}
cmd_buffer->state.dirty &= ~states;
}