[Mesa-dev] [PATCH 11/22] i965: generalize brw_vs_pull_constants in preparation for GS.
Paul Berry
stereotype441 at gmail.com
Thu Aug 29 10:39:20 PDT 2013
On 28 August 2013 18:06, Kenneth Graunke <kenneth at whitecape.org> wrote:
> On 08/26/2013 03:12 PM, Paul Berry wrote:
>
>> ---
>> src/mesa/drivers/dri/i965/brw_**state.h | 8 +++
>> src/mesa/drivers/dri/i965/brw_**vs_surface_state.c | 66
>> +++++++++++++++---------
>> 2 files changed, 50 insertions(+), 24 deletions(-)
>>
>> diff --git a/src/mesa/drivers/dri/i965/**brw_state.h
>> b/src/mesa/drivers/dri/i965/**brw_state.h
>> index 4814639..e7a1b40 100644
>> --- a/src/mesa/drivers/dri/i965/**brw_state.h
>> +++ b/src/mesa/drivers/dri/i965/**brw_state.h
>> @@ -221,6 +221,14 @@ uint32_t
>> get_attr_override(const struct brw_vue_map *vue_map, int
>> urb_entry_read_offset,
>> int fs_attr, bool two_side_color, uint32_t
>> *max_source_attr);
>>
>> +/* brw_vs_surface_state.c */
>> +void
>> +brw_upload_vec4_pull_**constants(struct brw_context *brw,
>> + GLbitfield64 brw_new_constbuf,
>>
>
> FWIW, brw->state.dirty.brw is only 32-bits currently. That said, it's
> probably going to change in the not-too-distant future, so using
> GLbitfield64 preemptively isn't crazy.
Oops, I didn't even realize I did that. I think I'll change it back to
GLbitfield, just so that it doesn't cause any confusion for people.
>
>
> + const struct gl_program *prog,
>> + struct brw_vec4_context_base *vec4_ctx,
>> + const struct brw_vec4_prog_data
>> *prog_data);
>> +
>> #ifdef __cplusplus
>> }
>> #endif
>> diff --git a/src/mesa/drivers/dri/i965/**brw_vs_surface_state.c
>> b/src/mesa/drivers/dri/i965/**brw_vs_surface_state.c
>> index 629eb96..48124bf 100644
>> --- a/src/mesa/drivers/dri/i965/**brw_vs_surface_state.c
>> +++ b/src/mesa/drivers/dri/i965/**brw_vs_surface_state.c
>> @@ -35,56 +35,50 @@
>> #include "brw_context.h"
>> #include "brw_state.h"
>>
>> -/* Creates a new VS constant buffer reflecting the current VS program's
>> - * constants, if needed by the VS program.
>> - *
>> - * Otherwise, constants go through the CURBEs using the
>> brw_constant_buffer
>> - * state atom.
>> - */
>> -static void
>> -brw_upload_vs_pull_constants(**struct brw_context *brw)
>> -{
>> - struct brw_vec4_context_base *vec4_ctx = &brw->vs.base;
>>
>> - /* BRW_NEW_VERTEX_PROGRAM */
>> - struct brw_vertex_program *vp =
>> - (struct brw_vertex_program *) brw->vertex_program;
>> +void
>> +brw_upload_vec4_pull_**constants(struct brw_context *brw,
>> + GLbitfield64 brw_new_constbuf,
>> + const struct gl_program *prog,
>> + struct brw_vec4_context_base *vec4_ctx,
>> + const struct brw_vec4_prog_data
>> *prog_data)
>> +{
>> int i;
>>
>> /* Updates the ParamaterValues[i] pointers for all parameters of the
>> * basic type of PROGRAM_STATE_VAR.
>> */
>> - _mesa_load_state_parameters(&**brw->ctx,
>> vp->program.Base.Parameters);
>> + _mesa_load_state_parameters(&**brw->ctx, prog->Parameters);
>>
>> - /* CACHE_NEW_VS_PROG */
>> - if (!brw->vs.prog_data->base.nr_**pull_params) {
>> + if (!prog_data->nr_pull_params) {
>> if (vec4_ctx->const_bo) {
>> drm_intel_bo_unreference(vec4_**ctx->const_bo);
>> vec4_ctx->const_bo = NULL;
>> vec4_ctx->surf_offset[SURF_**INDEX_VEC4_CONST_BUFFER] = 0;
>> - brw->state.dirty.brw |= BRW_NEW_VS_CONSTBUF;
>> + brw->state.dirty.brw |= brw_new_constbuf;
>> }
>> return;
>> }
>>
>> /* _NEW_PROGRAM_CONSTANTS */
>> drm_intel_bo_unreference(vec4_**ctx->const_bo);
>> - uint32_t size = brw->vs.prog_data->base.nr_**pull_params * 4;
>> - vec4_ctx->const_bo = drm_intel_bo_alloc(brw->**bufmgr,
>> "vp_const_buffer",
>> + uint32_t size = prog_data->nr_pull_params * 4;
>> + vec4_ctx->const_bo = drm_intel_bo_alloc(brw->**bufmgr,
>> "vec4_const_buffer",
>> size, 64);
>>
>> drm_intel_gem_bo_map_gtt(vec4_**ctx->const_bo);
>> - for (i = 0; i < brw->vs.prog_data->base.nr_**pull_params; i++) {
>> +
>> + for (i = 0; i < prog_data->nr_pull_params; i++) {
>> memcpy(vec4_ctx->const_bo->**virtual + i * 4,
>> - brw->vs.prog_data->base.pull_**param[i],
>> + prog_data->pull_param[i],
>> 4);
>> }
>>
>> if (0) {
>> - for (i = 0; i < ALIGN(brw->vs.prog_data->base.**nr_pull_params,
>> 4) / 4;
>> + for (i = 0; i < ALIGN(prog_data->nr_pull_**params, 4) / 4;
>> i++) {
>>
>
> You could probably move the i++ up a line since it's shorter now.
>
Done.
>
> This patch is great.
>
>
> float *row = (float *)vec4_ctx->const_bo->virtual + i * 4;
>> - printf("vs const surface %3d: %4.3f %4.3f %4.3f %4.3f\n",
>> + printf("const surface %3d: %4.3f %4.3f %4.3f %4.3f\n",
>> i, row[0], row[1], row[2], row[3]);
>> }
>> }
>> @@ -95,7 +89,31 @@ brw_upload_vs_pull_constants(**struct brw_context
>> *brw)
>> brw->vtbl.create_constant_**surface(brw, vec4_ctx->const_bo, 0,
>> size,
>> &vec4_ctx->surf_offset[surf],
>> false);
>>
>> - brw->state.dirty.brw |= BRW_NEW_VS_CONSTBUF;
>> + brw->state.dirty.brw |= brw_new_constbuf;
>> +}
>> +
>> +
>> +/* Creates a new VS constant buffer reflecting the current VS program's
>> + * constants, if needed by the VS program.
>> + *
>> + * Otherwise, constants go through the CURBEs using the
>> brw_constant_buffer
>> + * state atom.
>> + */
>> +static void
>> +brw_upload_vs_pull_constants(**struct brw_context *brw)
>> +{
>> + struct brw_vec4_context_base *vec4_ctx = &brw->vs.base;
>> +
>> + /* BRW_NEW_VERTEX_PROGRAM */
>> + struct brw_vertex_program *vp =
>> + (struct brw_vertex_program *) brw->vertex_program;
>> +
>> + /* CACHE_NEW_VS_PROG */
>> + const struct brw_vec4_prog_data *prog_data = &brw->vs.prog_data->base;
>> +
>> + /* _NEW_PROGRAM_CONSTANTS */
>> + brw_upload_vec4_pull_**constants(brw, BRW_NEW_VS_CONSTBUF,
>> &vp->program.Base,
>> + vec4_ctx, prog_data);
>> }
>>
>> const struct brw_tracked_state brw_vs_pull_constants = {
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130829/2f2ad214/attachment-0001.html>
More information about the mesa-dev
mailing list