[Mesa-dev] [PATCH 08/16] mesa: add uniform packing support to _mesa_add_typed_unnamed_constant()
Timothy Arceri
tarceri at itsqueeze.com
Tue Jun 20 01:50:37 UTC 2017
---
src/mesa/program/prog_parameter.c | 53 +++++++++++++++++-------------
src/mesa/program/prog_parameter.h | 14 +++++---
src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 5 +--
3 files changed, 43 insertions(+), 29 deletions(-)
diff --git a/src/mesa/program/prog_parameter.c b/src/mesa/program/prog_parameter.c
index a677493..7a5ccda 100644
--- a/src/mesa/program/prog_parameter.c
+++ b/src/mesa/program/prog_parameter.c
@@ -304,56 +304,65 @@ _mesa_add_parameter(struct gl_program_parameter_list *paramList,
* MOV r, { 0, 1, 2, 3 };
* If swizzleOut is non-null we'll search the parameter list for an
* existing instance of the constant which matches with a swizzle.
*
* \param paramList the parameter list
* \param values four float values
* \param swizzleOut returns swizzle mask for accessing the constant
* \return index/position of the new parameter in the parameter list.
*/
GLint
-_mesa_add_typed_unnamed_constant(struct gl_program_parameter_list *paramList,
- const gl_constant_value values[4], GLuint size,
- GLenum datatype, GLuint *swizzleOut)
+_mesa_add_typed_unnamed_constant(struct gl_context *ctx,
+ struct gl_program_parameter_list *paramList,
+ const gl_constant_value values[4],
+ GLuint size, GLenum datatype,
+ GLuint *swizzleOut)
{
GLint pos;
assert(size >= 1);
assert(size <= 4);
if (swizzleOut &&
lookup_parameter_constant(paramList, values, size, &pos, swizzleOut)) {
return pos;
}
- /* Look for empty space in an already unnamed constant parameter
- * to add this constant. This will only work for single-element
- * constants because we rely on smearing (i.e. .yyyy or .zzzz).
- */
- if (size == 1 && swizzleOut) {
- for (pos = 0; pos < (GLint) paramList->NumParameters; pos++) {
- struct gl_program_parameter *p = paramList->Parameters + pos;
- unsigned offset = paramList->ParameterValueOffset[pos];
- if (p->Type == PROGRAM_CONSTANT && p->Size + size <= 4) {
- /* ok, found room */
- gl_constant_value *pVal = paramList->ParameterValues + offset;
- GLuint swz = p->Size; /* 1, 2 or 3 for Y, Z, W */
- pVal[p->Size] = values[0];
- p->Size++;
- *swizzleOut = MAKE_SWIZZLE4(swz, swz, swz, swz);
- return pos;
+ if (ctx->Const.PackedDriverUniformStorage) {
+ /* add a new parameter to store this constant */
+ pos = _mesa_add_parameter(paramList, PROGRAM_CONSTANT, NULL,
+ size, datatype, values, NULL, false);
+ } else {
+ /* Look for empty space in an already unnamed constant parameter
+ * to add this constant. This will only work for single-element
+ * constants because we rely on smearing (i.e. .yyyy or .zzzz).
+ */
+ if (size == 1 && swizzleOut) {
+ for (pos = 0; pos < (GLint) paramList->NumParameters; pos++) {
+ struct gl_program_parameter *p = paramList->Parameters + pos;
+ unsigned offset = paramList->ParameterValueOffset[pos];
+ if (p->Type == PROGRAM_CONSTANT && p->Size + size <= 4) {
+ /* ok, found room */
+ gl_constant_value *pVal = paramList->ParameterValues + offset;
+ GLuint swz = p->Size; /* 1, 2 or 3 for Y, Z, W */
+ pVal[p->Size] = values[0];
+ p->Size++;
+ *swizzleOut = MAKE_SWIZZLE4(swz, swz, swz, swz);
+ return pos;
+ }
}
}
+
+ /* add a new parameter to store this constant */
+ pos = _mesa_add_parameter(paramList, PROGRAM_CONSTANT, NULL,
+ size, datatype, values, NULL, size < 4);
}
- /* add a new parameter to store this constant */
- pos = _mesa_add_parameter(paramList, PROGRAM_CONSTANT, NULL,
- size, datatype, values, NULL, size < 4);
if (pos >= 0 && swizzleOut) {
if (size == 1)
*swizzleOut = SWIZZLE_XXXX;
else
*swizzleOut = SWIZZLE_NOOP;
}
return pos;
}
diff --git a/src/mesa/program/prog_parameter.h b/src/mesa/program/prog_parameter.h
index e5f3b39..39bf205 100644
--- a/src/mesa/program/prog_parameter.h
+++ b/src/mesa/program/prog_parameter.h
@@ -107,31 +107,35 @@ _mesa_reserve_parameter_storage(struct gl_program_parameter_list *paramList,
extern GLint
_mesa_add_parameter(struct gl_program_parameter_list *paramList,
gl_register_file type, const char *name,
GLuint size, GLenum datatype,
const gl_constant_value *values,
const gl_state_index state[STATE_LENGTH],
bool pad_and_align);
extern GLint
-_mesa_add_typed_unnamed_constant(struct gl_program_parameter_list *paramList,
- const gl_constant_value values[4], GLuint size,
- GLenum datatype, GLuint *swizzleOut);
+_mesa_add_typed_unnamed_constant(struct gl_context *ctx,
+ struct gl_program_parameter_list *paramList,
+ const gl_constant_value values[4],
+ GLuint size, GLenum datatype,
+ GLuint *swizzleOut);
static inline GLint
_mesa_add_unnamed_constant(struct gl_program_parameter_list *paramList,
const gl_constant_value values[4], GLuint size,
GLuint *swizzleOut)
{
- return _mesa_add_typed_unnamed_constant(paramList, values, size, GL_NONE,
- swizzleOut);
+ GET_CURRENT_CONTEXT(ctx);
+
+ return _mesa_add_typed_unnamed_constant(ctx, paramList, values, size,
+ GL_NONE, swizzleOut);
}
extern GLint
_mesa_add_state_reference(struct gl_program_parameter_list *paramList,
const gl_state_index stateTokens[STATE_LENGTH]);
static inline GLint
_mesa_lookup_parameter_index(const struct gl_program_parameter_list *paramList,
const char *name)
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index 36e0fd5..885fd7d 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -1119,22 +1119,23 @@ glsl_to_tgsi_visitor::emit_arl(ir_instruction *ir,
emit_asm(NULL, op, dst, src0);
}
int
glsl_to_tgsi_visitor::add_constant(gl_register_file file,
gl_constant_value values[8], int size, int datatype,
uint16_t *swizzle_out)
{
if (file == PROGRAM_CONSTANT) {
GLuint swizzle = swizzle_out ? *swizzle_out : 0;
- int result = _mesa_add_typed_unnamed_constant(this->prog->Parameters, values,
- size, datatype, &swizzle);
+ int result = _mesa_add_typed_unnamed_constant(ctx, prog->Parameters,
+ values, size, datatype,
+ &swizzle);
if (swizzle_out)
*swizzle_out = swizzle;
return result;
}
assert(file == PROGRAM_IMMEDIATE);
int index = 0;
immediate_storage *entry;
int size32 = size * ((datatype == GL_DOUBLE ||
--
2.9.4
More information about the mesa-dev
mailing list