[Mesa-dev] [PATCH 12/59] mesa: Add support for 64-bit integer uniforms. (v2)
Ian Romanick
idr at freedesktop.org
Thu Nov 10 22:57:22 UTC 2016
On 10/27/2016 06:02 AM, Nicolai Hähnle wrote:
> On 26.10.2016 02:59, Ian Romanick wrote:
>> From: Dave Airlie <airlied at redhat.com>
>>
>> This hooks up the API to the internals for 64-bit integer uniforms.
>>
>> v2: update to use non-strict aliased alternatives
>>
>> Signed-off-by: Dave Airlie <airlied at redhat.com>
>> Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
>> ---
>> src/mesa/main/uniform_query.cpp | 82 ++++++++++++++++++-
>> src/mesa/main/uniforms.c | 170
>> +++++++++++++++++++++++++++++++++++++++-
>> 2 files changed, 247 insertions(+), 5 deletions(-)
>>
>> diff --git a/src/mesa/main/uniform_query.cpp
>> b/src/mesa/main/uniform_query.cpp
>> index db700df..8ecaef4 100644
>> --- a/src/mesa/main/uniform_query.cpp
>> +++ b/src/mesa/main/uniform_query.cpp
> [snip]
>> @@ -416,6 +433,22 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint
>> program, GLint location,
>> memcpy(&dst[didx].f, &tmp, sizeof(tmp));
>> break;
>> }
>> + case GLSL_TYPE_UINT64: {
>> + uint64_t tmpu;
>> + double tmp;
>> + memcpy(&tmpu, &src[sidx].u, sizeof(tmpu));
>> + tmp = tmpu;
>> + memcpy(&dst[didx].f, &tmp, sizeof(tmp));
>> + break;
>> + }
>> + case GLSL_TYPE_INT64: {
>> + int64_t tmpi;
>> + double tmp;
>> + memcpy(&tmpi, &src[sidx].i, sizeof(tmpi));
>> + tmp = tmpi;
>> + memcpy(&dst[didx].f, &tmp, sizeof(tmp));
>> + break;
>
> This pattern really looks quite nasty. Can we at least not pretend that
> the .f is meaningful and use
>
> memcpy(&dst[dix], ...);
>
> or maybe even *(double *)&dst[didx] = tmpi;?
I think we need to do the memcpy (and should below too) to avoid
strict-aliasing problems. I don't recall all the details. Perhaps Matt
can offer some guidance.
>> + }
>> default:
>> assert(!"Should not get here.");
>> break;
>> @@ -453,12 +486,45 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint
>> program, GLint location,
>> dst[didx].i = IROUNDD(tmp);
>> break;
>> }
>> + case GLSL_TYPE_UINT64: {
>> + uint64_t tmp;
>> + memcpy(&tmp, &src[sidx].u, sizeof(tmp));
>> + dst[didx].i = tmp;
>> + break;
>> + }
>> + case GLSL_TYPE_INT64: {
>> + int64_t tmp;
>> + memcpy(&tmp, &src[sidx].i, sizeof(tmp));
>> + dst[didx].i = tmp;
>> + break;
>> + }
>> default:
>> assert(!"Should not get here.");
>> break;
>> }
>> break;
>> -
>> + case GLSL_TYPE_INT64:
>> + case GLSL_TYPE_UINT64:
>> + switch (uni->type->base_type) {
>> + case GLSL_TYPE_UINT:
>> + *(int64_t *)&dst[didx].u = (int64_t) src[sidx].u;
>> + break;
>> + case GLSL_TYPE_INT:
>> + case GLSL_TYPE_SAMPLER:
>> + case GLSL_TYPE_IMAGE:
>> + *(int64_t *)&dst[didx].u = (int64_t) src[sidx].i;
>> + break;
>> + case GLSL_TYPE_BOOL:
>> + *(int64_t *)&dst[didx].u = src[sidx].i ? 1.0f : 0.0f;
>> + break;
>> + case GLSL_TYPE_FLOAT:
>> + *(int64_t *)&dst[didx].u = (int64_t) src[sidx].f;
>
> Similarly here, the .u is really quite meaningless.
>
> The rest looks good to me.
>
> Cheers,
> Nicolai
>
More information about the mesa-dev
mailing list