[Mesa-dev] [PATCH 11/14] intel/blorp: Add a helper for filling out VERTEX_BUFFER_STATE
Lionel Landwerlin
lionel.g.landwerlin at intel.com
Tue Nov 14 18:05:40 UTC 2017
On 13/11/17 16:12, Jason Ekstrand wrote:
> There are enough #ifs in there that it's kind-of pointless to duplicate
> it for each buffer.
> ---
> src/intel/blorp/blorp_genX_exec.h | 69 +++++++++++++++++++--------------------
> 1 file changed, 33 insertions(+), 36 deletions(-)
>
> diff --git a/src/intel/blorp/blorp_genX_exec.h b/src/intel/blorp/blorp_genX_exec.h
> index 4f88650..7548392 100644
> --- a/src/intel/blorp/blorp_genX_exec.h
> +++ b/src/intel/blorp/blorp_genX_exec.h
> @@ -263,53 +263,50 @@ blorp_emit_input_varying_data(struct blorp_batch *batch,
> }
>
> static void
> -blorp_emit_vertex_buffers(struct blorp_batch *batch,
> - const struct blorp_params *params)
> +blorp_fill_vertex_buffer_state(struct blorp_batch *batch,
> + struct GENX(VERTEX_BUFFER_STATE) *vb,
> + unsigned idx,
> + struct blorp_address addr, uint32_t size,
> + uint32_t stride)
> {
> - struct GENX(VERTEX_BUFFER_STATE) vb[2];
> - memset(vb, 0, sizeof(vb));
> + vb[idx].VertexBufferIndex = idx;
> + vb[idx].BufferStartingAddress = addr;
> + vb[idx].BufferPitch = stride;
>
> - uint32_t size;
> - blorp_emit_vertex_data(batch, params, &vb[0].BufferStartingAddress, &size);
> - vb[0].VertexBufferIndex = 0;
> - vb[0].BufferPitch = 3 * sizeof(float);
> #if GEN_GEN >= 6
> - vb[0].VertexBufferMOCS = batch->blorp->mocs.vb;
> -#endif
> -#if GEN_GEN >= 7
> - vb[0].AddressModifyEnable = true;
> -#endif
> -#if GEN_GEN >= 8
> - vb[0].BufferSize = size;
> -#elif GEN_GEN >= 5
> - vb[0].BufferAccessType = VERTEXDATA;
> - vb[0].EndAddress = vb[0].BufferStartingAddress;
> - vb[0].EndAddress.offset += size - 1;
> -#elif GEN_GEN == 4
> - vb[0].BufferAccessType = VERTEXDATA;
> - vb[0].MaxIndex = 2;
> + vb[idx].VertexBufferMOCS = batch->blorp->mocs.vb;
> #endif
>
> - blorp_emit_input_varying_data(batch, params,
> - &vb[1].BufferStartingAddress, &size);
> - vb[1].VertexBufferIndex = 1;
> - vb[1].BufferPitch = 0;
> -#if GEN_GEN >= 6
> - vb[1].VertexBufferMOCS = batch->blorp->mocs.vb;
> -#endif
> #if GEN_GEN >= 7
> - vb[1].AddressModifyEnable = true;
> + vb[idx].AddressModifyEnable = true;
> #endif
> +
> #if GEN_GEN >= 8
> - vb[1].BufferSize = size;
> + vb[idx].BufferSize = size;
> #elif GEN_GEN >= 5
> - vb[1].BufferAccessType = INSTANCEDATA;
> - vb[1].EndAddress = vb[1].BufferStartingAddress;
> - vb[1].EndAddress.offset += size - 1;
> + vb[idx].BufferAccessType = stride > 0 ? VERTEXDATA : INSTANCEDATA;
> + vb[idx].EndAddress = vb[idx].BufferStartingAddress;
> + vb[idx].EndAddress.offset += size - 1;
> #elif GEN_GEN == 4
> - vb[1].BufferAccessType = INSTANCEDATA;
> - vb[1].MaxIndex = 0;
> + vb[idx].BufferAccessType = stride > 0 ? VERTEXDATA : INSTANCEDATA;
> + vb[idx].MaxIndex = 2;
This MaxIndex used to be 0 for vb[1], now it's always 2 on gen4.
I can't really tell whether that's going to have an unintended effect :(
> #endif
> +}
> +
> +static void
> +blorp_emit_vertex_buffers(struct blorp_batch *batch,
> + const struct blorp_params *params)
> +{
> + struct GENX(VERTEX_BUFFER_STATE) vb[2];
> + memset(vb, 0, sizeof(vb));
> +
> + struct blorp_address addr;
> + uint32_t size;
> + blorp_emit_vertex_data(batch, params, &addr, &size);
> + blorp_fill_vertex_buffer_state(batch, vb, 0, addr, size, 3 * sizeof(float));
> +
> + blorp_emit_input_varying_data(batch, params, &addr, &size);
> + blorp_fill_vertex_buffer_state(batch, vb, 1, addr, size, 0);
>
> const unsigned num_dwords = 1 + GENX(VERTEX_BUFFER_STATE_length) * 2;
> uint32_t *dw = blorp_emitn(batch, GENX(3DSTATE_VERTEX_BUFFERS), num_dwords);
More information about the mesa-dev
mailing list