/** * Update the surface state for a WM constant buffer. * The constant buffer will be (re)allocated here if needed. */ static void brw_update_wm_constant_surface( GLcontext *ctx, GLuint surf) { struct brw_context *brw = brw_context(ctx); struct brw_surface_key key; struct brw_fragment_program *fp = (struct brw_fragment_program *) brw->fragment_program; const struct gl_program_parameter_list *params = fp->program.Base.Parameters; /* If we're in this state update atom, we need to update WM constants, so * free the old buffer and create a new one for the new contents. */ dri_bo_unreference(fp->const_buffer); fp->const_buffer = brw_wm_update_constant_buffer(brw); /* If there's no constant buffer, then no surface BO is needed to point at * it. */ if (fp->const_buffer == NULL) { drm_intel_bo_unreference(brw->wm.surf_bo[surf]); brw->wm.surf_bo[surf] = NULL; return; } memset(&key, 0, sizeof(key)); key.format = MESA_FORMAT_RGBA_FLOAT32; key.internal_format = GL_RGBA; key.bo = fp->const_buffer; key.depthmode = GL_NONE; key.pitch = params->NumParameters; key.width = params->NumParameters; key.height = 1; key.depth = 1; key.cpp = 16; /* printf("%s:\n", __FUNCTION__); printf(" width %d height %d depth %d cpp %d pitch %d\n", key.width, key.height, key.depth, key.cpp, key.pitch); */ dri_bo_unreference(brw->wm.surf_bo[surf]); brw->wm.surf_bo[surf] = brw_search_cache(&brw->surface_cache, BRW_SS_SURFACE, &key, sizeof(key), &key.bo, 1, NULL); if (brw->wm.surf_bo[surf] == NULL) { brw->wm.surf_bo[surf] = brw_create_constant_surface(brw, &key); } brw->state.dirty.brw |= BRW_NEW_WM_SURFACES; }
void brw_upload_vec4_pull_constants(struct brw_context *brw, GLbitfield brw_new_constbuf, const struct gl_program *prog, struct brw_stage_state *stage_state, const struct brw_vec4_prog_data *prog_data) { int i; uint32_t surf_index = prog_data->base.binding_table.pull_constants_start; /* Updates the ParamaterValues[i] pointers for all parameters of the * basic type of PROGRAM_STATE_VAR. */ _mesa_load_state_parameters(&brw->ctx, prog->Parameters); if (!prog_data->nr_pull_params) { if (stage_state->const_bo) { drm_intel_bo_unreference(stage_state->const_bo); stage_state->const_bo = NULL; stage_state->surf_offset[surf_index] = 0; brw->state.dirty.brw |= brw_new_constbuf; } return; } /* _NEW_PROGRAM_CONSTANTS */ drm_intel_bo_unreference(stage_state->const_bo); uint32_t size = prog_data->nr_pull_params * 4; stage_state->const_bo = drm_intel_bo_alloc(brw->bufmgr, "vec4_const_buffer", size, 64); drm_intel_gem_bo_map_gtt(stage_state->const_bo); for (i = 0; i < prog_data->nr_pull_params; i++) { memcpy(stage_state->const_bo->virtual + i * 4, prog_data->pull_param[i], 4); } if (0) { for (i = 0; i < ALIGN(prog_data->nr_pull_params, 4) / 4; i++) { float *row = (float *)stage_state->const_bo->virtual + i * 4; printf("const surface %3d: %4.3f %4.3f %4.3f %4.3f\n", i, row[0], row[1], row[2], row[3]); } } drm_intel_gem_bo_unmap_gtt(stage_state->const_bo); brw_create_constant_surface(brw, stage_state->const_bo, 0, size, &stage_state->surf_offset[surf_index], false); brw->state.dirty.brw |= brw_new_constbuf; }
/** * Creates a temporary BO containing the pull constant data for the shader * stage, and the SURFACE_STATE struct that points at it. * * Pull constants are GLSL uniforms (and other constant data) beyond what we * could fit as push constants, or that have variable-index array access * (which is easiest to support using pull constants, and avoids filling * register space with mostly-unused data). * * Compare this path to brw_curbe.c for gen4/5 push constants, and * gen6_vs_state.c for gen6+ push constants. */ void brw_upload_pull_constants(struct brw_context *brw, GLbitfield brw_new_constbuf, const struct gl_program *prog, struct brw_stage_state *stage_state, const struct brw_stage_prog_data *prog_data, bool dword_pitch) { int i; uint32_t surf_index = prog_data->binding_table.pull_constants_start; if (!prog_data->nr_pull_params) { if (stage_state->surf_offset[surf_index]) { stage_state->surf_offset[surf_index] = 0; brw->ctx.NewDriverState |= brw_new_constbuf; } return; } /* Updates the ParamaterValues[i] pointers for all parameters of the * basic type of PROGRAM_STATE_VAR. */ _mesa_load_state_parameters(&brw->ctx, prog->Parameters); /* BRW_NEW_*_PROG_DATA | _NEW_PROGRAM_CONSTANTS */ uint32_t size = prog_data->nr_pull_params * 4; drm_intel_bo *const_bo = NULL; uint32_t const_offset; gl_constant_value *constants = intel_upload_space(brw, size, 64, &const_bo, &const_offset); STATIC_ASSERT(sizeof(gl_constant_value) == sizeof(float)); for (i = 0; i < prog_data->nr_pull_params; i++) { constants[i] = *prog_data->pull_param[i]; } if (0) { for (i = 0; i < ALIGN(prog_data->nr_pull_params, 4) / 4; i++) { const gl_constant_value *row = &constants[i * 4]; fprintf(stderr, "const surface %3d: %4.3f %4.3f %4.3f %4.3f\n", i, row[0].f, row[1].f, row[2].f, row[3].f); } } brw_create_constant_surface(brw, const_bo, const_offset, size, &stage_state->surf_offset[surf_index], dword_pitch); drm_intel_bo_unreference(const_bo); brw->ctx.NewDriverState |= brw_new_constbuf; }