[Mesa-dev] [PATCH 11/13] i965: Refactor Gen4-7 VERTEX_BUFFER_STATE emission into a helper.
Ian Romanick
idr at freedesktop.org
Fri Aug 8 10:51:47 PDT 2014
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
On 08/08/2014 12:31 AM, Kenneth Graunke wrote:
> We'll need to emit another VERTEX_BUFFER_STATE for gl_BaseVertex;
> pulling this into a helper function will save us from having to deal
> with cross-generation differences in that code.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
> src/mesa/drivers/dri/i965/brw_draw_upload.c | 77 ++++++++++++++++++-----------
> 1 file changed, 47 insertions(+), 30 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_draw_upload.c b/src/mesa/drivers/dri/i965/brw_draw_upload.c
> index 37a65bc..7c01d79 100644
> --- a/src/mesa/drivers/dri/i965/brw_draw_upload.c
> +++ b/src/mesa/drivers/dri/i965/brw_draw_upload.c
> @@ -625,9 +625,52 @@ brw_prepare_shader_draw_parameters(struct brw_context *brw)
> }
> }
>
> -static void brw_emit_vertices(struct brw_context *brw)
> +/**
> + * Emit a VERTEX_BUFFER_STATE entry (part of 3DSTATE_VERTEX_BUFFERS).
> + */
> +static void
> +emit_vertex_buffer_state(struct brw_context *brw,
> + unsigned buffer_nr,
> + drm_intel_bo *bo,
> + unsigned bo_ending_address,
> + unsigned bo_offset,
> + unsigned stride,
> + unsigned step_rate)
> {
> struct gl_context *ctx = &brw->ctx;
> + uint32_t dw0;
> +
> + if (brw->gen >= 6) {
> + dw0 = (buffer_nr << GEN6_VB0_INDEX_SHIFT) |
> + (step_rate ? GEN6_VB0_ACCESS_INSTANCEDATA
> + : GEN6_VB0_ACCESS_VERTEXDATA);
> + } else {
> + dw0 = (buffer_nr << BRW_VB0_INDEX_SHIFT) |
> + (step_rate ? BRW_VB0_ACCESS_INSTANCEDATA
> + : BRW_VB0_ACCESS_VERTEXDATA);
> + }
> +
> + if (brw->gen >= 7)
> + dw0 |= GEN7_VB0_ADDRESS_MODIFYENABLE;
> +
> + if (brw->gen == 7)
> + dw0 |= GEN7_MOCS_L3 << 16;
> +
> + WARN_ONCE(stride >= (brw->gen >= 5 ? 2048 : 2047),
> + "VBO stride %d too large, bad rendering may occur\n",
> + stride);
> + OUT_BATCH(dw0 | (stride << BRW_VB0_PITCH_SHIFT));
> + OUT_RELOC(bo, I915_GEM_DOMAIN_VERTEX, 0, bo_offset);
> + if (brw->gen >= 5) {
> + OUT_RELOC(bo, I915_GEM_DOMAIN_VERTEX, 0, bo_ending_address);
> + } else {
> + OUT_BATCH(0);
> + }
> + OUT_BATCH(step_rate);
> +}
> +
> +static void brw_emit_vertices(struct brw_context *brw)
> +{
> GLuint i, nr_elements;
>
> brw_prepare_vertices(brw);
> @@ -680,36 +723,10 @@ static void brw_emit_vertices(struct brw_context *brw)
> OUT_BATCH((_3DSTATE_VERTEX_BUFFERS << 16) | (4*brw->vb.nr_buffers - 1));
> for (i = 0; i < brw->vb.nr_buffers; i++) {
> struct brw_vertex_buffer *buffer = &brw->vb.buffers[i];
> - uint32_t dw0;
> -
> - if (brw->gen >= 6) {
> - dw0 = buffer->step_rate
> - ? GEN6_VB0_ACCESS_INSTANCEDATA
> - : GEN6_VB0_ACCESS_VERTEXDATA;
> - dw0 |= i << GEN6_VB0_INDEX_SHIFT;
> - } else {
> - dw0 = buffer->step_rate
> - ? BRW_VB0_ACCESS_INSTANCEDATA
> - : BRW_VB0_ACCESS_VERTEXDATA;
> - dw0 |= i << BRW_VB0_INDEX_SHIFT;
> - }
> + emit_vertex_buffer_state(brw, i, buffer->bo, buffer->bo->size - 1,
> + buffer->offset, buffer->stride,
> + buffer->step_rate);
>
> - if (brw->gen >= 7)
> - dw0 |= GEN7_VB0_ADDRESS_MODIFYENABLE;
> -
> - if (brw->gen == 7)
> - dw0 |= GEN7_MOCS_L3 << 16;
> -
> - WARN_ONCE(buffer->stride >= (brw->gen >= 5 ? 2048 : 2047),
> - "VBO stride %d too large, bad rendering may occur\n",
> - buffer->stride);
> - OUT_BATCH(dw0 | (buffer->stride << BRW_VB0_PITCH_SHIFT));
> - OUT_RELOC(buffer->bo, I915_GEM_DOMAIN_VERTEX, 0, buffer->offset);
> - if (brw->gen >= 5) {
> - OUT_RELOC(buffer->bo, I915_GEM_DOMAIN_VERTEX, 0, buffer->bo->size - 1);
> - } else
> - OUT_BATCH(0);
> - OUT_BATCH(buffer->step_rate);
> }
> ADVANCE_BATCH();
> }
>
More information about the mesa-dev
mailing list