mesa: take advantage of sorted parameters in _mesa_load_state_parameters
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6946>
This commit is contained in:
@@ -1044,6 +1044,8 @@ write_shader_parameters(struct blob *metadata,
|
|||||||
sizeof(gl_constant_value) * params->NumParameterValues);
|
sizeof(gl_constant_value) * params->NumParameterValues);
|
||||||
|
|
||||||
blob_write_uint32(metadata, params->StateFlags);
|
blob_write_uint32(metadata, params->StateFlags);
|
||||||
|
blob_write_uint32(metadata, params->LastUniformIndex);
|
||||||
|
blob_write_uint32(metadata, params->FirstStateVarIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1078,6 +1080,8 @@ read_shader_parameters(struct blob_reader *metadata,
|
|||||||
sizeof(gl_constant_value) * params->NumParameterValues);
|
sizeof(gl_constant_value) * params->NumParameterValues);
|
||||||
|
|
||||||
params->StateFlags = blob_read_uint32(metadata);
|
params->StateFlags = blob_read_uint32(metadata);
|
||||||
|
params->LastUniformIndex = blob_read_uint32(metadata);
|
||||||
|
params->FirstStateVarIndex = blob_read_uint32(metadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@@ -135,7 +135,14 @@ lookup_parameter_constant(const struct gl_program_parameter_list *list,
|
|||||||
struct gl_program_parameter_list *
|
struct gl_program_parameter_list *
|
||||||
_mesa_new_parameter_list(void)
|
_mesa_new_parameter_list(void)
|
||||||
{
|
{
|
||||||
return CALLOC_STRUCT(gl_program_parameter_list);
|
struct gl_program_parameter_list *list =
|
||||||
|
CALLOC_STRUCT(gl_program_parameter_list);
|
||||||
|
if (!list)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
list->LastUniformIndex = -1;
|
||||||
|
list->FirstStateVarIndex = INT_MAX;
|
||||||
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -262,7 +269,7 @@ _mesa_add_parameter(struct gl_program_parameter_list *paramList,
|
|||||||
bool pad_and_align)
|
bool pad_and_align)
|
||||||
{
|
{
|
||||||
assert(0 < size);
|
assert(0 < size);
|
||||||
const GLuint oldNum = paramList->NumParameters;
|
const int oldNum = paramList->NumParameters;
|
||||||
unsigned oldValNum = paramList->NumParameterValues;
|
unsigned oldValNum = paramList->NumParameterValues;
|
||||||
const unsigned padded_size = pad_and_align ? align(size, 4) : size;
|
const unsigned padded_size = pad_and_align ? align(size, 4) : size;
|
||||||
|
|
||||||
@@ -325,6 +332,16 @@ _mesa_add_parameter(struct gl_program_parameter_list *paramList,
|
|||||||
paramList->Parameters[oldNum].StateIndexes[i] = state[i];
|
paramList->Parameters[oldNum].StateIndexes[i] = state[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (type == PROGRAM_UNIFORM || type == PROGRAM_CONSTANT) {
|
||||||
|
paramList->LastUniformIndex =
|
||||||
|
MAX2(paramList->LastUniformIndex, oldNum);
|
||||||
|
} else if (type == PROGRAM_STATE_VAR) {
|
||||||
|
paramList->FirstStateVarIndex =
|
||||||
|
MIN2(paramList->FirstStateVarIndex, oldNum);
|
||||||
|
} else {
|
||||||
|
unreachable("invalid parameter type");
|
||||||
|
}
|
||||||
|
|
||||||
return (GLint) oldNum;
|
return (GLint) oldNum;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -432,3 +449,19 @@ _mesa_add_state_reference(struct gl_program_parameter_list *paramList,
|
|||||||
{
|
{
|
||||||
return _mesa_add_sized_state_reference(paramList, stateTokens, 4, true);
|
return _mesa_add_sized_state_reference(paramList, stateTokens, 4, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_mesa_recompute_parameter_bounds(struct gl_program_parameter_list *list)
|
||||||
|
{
|
||||||
|
list->FirstStateVarIndex = INT_MAX;
|
||||||
|
list->LastUniformIndex = -1;
|
||||||
|
|
||||||
|
for (int i = 0; i < (int)list->NumParameters; i++) {
|
||||||
|
if (list->Parameters[i].Type == PROGRAM_STATE_VAR) {
|
||||||
|
list->FirstStateVarIndex = MIN2(list->FirstStateVarIndex, i);
|
||||||
|
} else {
|
||||||
|
list->LastUniformIndex = MAX2(list->LastUniformIndex, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert(list->LastUniformIndex < list->FirstStateVarIndex);
|
||||||
|
}
|
||||||
|
@@ -142,6 +142,12 @@ struct gl_program_parameter_list
|
|||||||
GLbitfield StateFlags; /**< _NEW_* flags indicating which state changes
|
GLbitfield StateFlags; /**< _NEW_* flags indicating which state changes
|
||||||
might invalidate ParameterValues[] */
|
might invalidate ParameterValues[] */
|
||||||
bool DisallowRealloc;
|
bool DisallowRealloc;
|
||||||
|
|
||||||
|
/* Parameters are optionally sorted as follows. Uniforms and constants
|
||||||
|
* are first, then state vars.
|
||||||
|
*/
|
||||||
|
int LastUniformIndex;
|
||||||
|
int FirstStateVarIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -242,6 +248,9 @@ _mesa_gl_datatype_is_64bit(GLenum datatype)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_mesa_recompute_parameter_bounds(struct gl_program_parameter_list *list);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -231,6 +231,8 @@ _mesa_layout_parameters(struct asm_parser_state *state)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_mesa_recompute_parameter_bounds(layout);
|
||||||
|
|
||||||
layout->StateFlags = state->prog->Parameters->StateFlags;
|
layout->StateFlags = state->prog->Parameters->StateFlags;
|
||||||
_mesa_free_parameter_list(state->prog->Parameters);
|
_mesa_free_parameter_list(state->prog->Parameters);
|
||||||
state->prog->Parameters = layout;
|
state->prog->Parameters = layout;
|
||||||
|
@@ -1208,16 +1208,15 @@ void
|
|||||||
_mesa_load_state_parameters(struct gl_context *ctx,
|
_mesa_load_state_parameters(struct gl_context *ctx,
|
||||||
struct gl_program_parameter_list *paramList)
|
struct gl_program_parameter_list *paramList)
|
||||||
{
|
{
|
||||||
GLuint i;
|
|
||||||
|
|
||||||
if (!paramList)
|
if (!paramList)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i = 0; i < paramList->NumParameters; i++) {
|
assert(paramList->LastUniformIndex < paramList->FirstStateVarIndex);
|
||||||
if (paramList->Parameters[i].Type == PROGRAM_STATE_VAR) {
|
int num = paramList->NumParameters;
|
||||||
unsigned pvo = paramList->ParameterValueOffset[i];
|
|
||||||
fetch_state(ctx, paramList->Parameters[i].StateIndexes,
|
for (int i = paramList->FirstStateVarIndex; i < num; i++) {
|
||||||
paramList->ParameterValues + pvo);
|
unsigned pvo = paramList->ParameterValueOffset[i];
|
||||||
}
|
fetch_state(ctx, paramList->Parameters[i].StateIndexes,
|
||||||
|
paramList->ParameterValues + pvo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user