[Mesa-dev] [PATCH 03/20] mesa: separate legacy stuff from gl_texture_unit into gl_fixedfunc_texture_unit
Marek Olšák
maraeo at gmail.com
Wed Nov 22 22:09:34 UTC 2017
On Wed, Nov 22, 2017 at 10:15 PM, Ian Romanick <idr at freedesktop.org> wrote:
> On 11/21/2017 10:01 AM, Marek Olšák wrote:
>> From: Marek Olšák <marek.olsak at amd.com>
>>
>> ---
>> src/mesa/drivers/common/meta.c | 18 +++---
>> src/mesa/drivers/dri/i915/i830_texblend.c | 3 +-
>> src/mesa/drivers/dri/nouveau/nouveau_util.h | 2 +-
>> src/mesa/drivers/dri/nouveau/nv04_context.c | 14 +++--
>> src/mesa/drivers/dri/nouveau/nv04_state_frag.c | 6 +-
>> src/mesa/drivers/dri/nouveau/nv10_state_frag.c | 4 +-
>> src/mesa/drivers/dri/nouveau/nv10_state_tex.c | 5 +-
>> src/mesa/drivers/dri/nouveau/nv20_state_tex.c | 3 +-
>> src/mesa/drivers/dri/r200/r200_tex.c | 3 +-
>> src/mesa/drivers/dri/r200/r200_texstate.c | 31 +++++----
>> src/mesa/drivers/dri/radeon/radeon_maos_verts.c | 2 +-
>> src/mesa/drivers/dri/radeon/radeon_state.c | 2 +-
>> src/mesa/drivers/dri/radeon/radeon_tex.c | 3 +-
>> src/mesa/drivers/dri/radeon/radeon_texstate.c | 13 ++--
>> src/mesa/main/attrib.c | 17 ++---
>> src/mesa/main/context.c | 6 +-
>> src/mesa/main/enable.c | 23 ++++---
>> src/mesa/main/ff_fragment_shader.cpp | 3 +-
>> src/mesa/main/ffvertex_prog.c | 5 +-
>> src/mesa/main/get.c | 7 ++-
>> src/mesa/main/get_hash_params.py | 10 +--
>> src/mesa/main/mtypes.h | 44 +++++++------
>> src/mesa/main/rastpos.c | 5 +-
>> src/mesa/main/texenv.c | 40 +++++++-----
>> src/mesa/main/texgen.c | 18 +++---
>> src/mesa/main/texstate.c | 83 ++++++++++++++-----------
>> src/mesa/main/texstate.h | 15 +++++
>> src/mesa/program/prog_statevars.c | 20 +++---
>> src/mesa/swrast/s_context.c | 2 +-
>> src/mesa/swrast/s_texcombine.c | 3 +-
>> src/mesa/swrast/s_triangle.c | 10 +--
>> src/mesa/tnl/t_vb_texgen.c | 10 +--
>> 32 files changed, 253 insertions(+), 177 deletions(-)
>>
>
> [snip]
>
>> diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
>> index 83838d8..cc18ac1 100644
>> --- a/src/mesa/main/get.c
>> +++ b/src/mesa/main/get.c
>> @@ -1357,21 +1357,20 @@ static const struct value_desc error_value =
>> *
>> * \return the struct value_desc corresponding to the enum or a struct
>> * value_desc of TYPE_INVALID if not found. This lets the calling
>> * glGet*v() function jump right into a switch statement and
>> * handle errors there instead of having to check for NULL.
>> */
>> static const struct value_desc *
>> find_value(const char *func, GLenum pname, void **p, union value *v)
>> {
>> GET_CURRENT_CONTEXT(ctx);
>> - struct gl_texture_unit *unit;
>> int mask, hash;
>> const struct value_desc *d;
>> int api;
>>
>> api = ctx->API;
>> /* We index into the table_set[] list of per-API hash tables using the API's
>> * value in the gl_api enum. Since GLES 3 doesn't have an API_OPENGL* enum
>> * value since it's compatible with GLES2 its entry in table_set[] is at the
>> * end.
>> */
>> @@ -1412,22 +1411,24 @@ find_value(const char *func, GLenum pname, void **p, union value *v)
>> case LOC_BUFFER:
>> *p = ((char *) ctx->DrawBuffer + d->offset);
>> return d;
>> case LOC_CONTEXT:
>> *p = ((char *) ctx + d->offset);
>> return d;
>> case LOC_ARRAY:
>> *p = ((char *) ctx->Array.VAO + d->offset);
>> return d;
>> case LOC_TEXUNIT:
>> - unit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
>> - *p = ((char *) unit + d->offset);
>> + if (ctx->Texture.CurrentUnit < ARRAY_SIZE(ctx->Texture.FixedFuncUnit)) {
>> + unsigned index = ctx->Texture.CurrentUnit;
>> + *p = ((char *)&ctx->Texture.FixedFuncUnit[index] + d->offset);
>> + }
>
> Presumably this is an error? Looking at the surrounding code, it's not
> obvious that the error is signaled. If we hit this patch, nothing ever
> initializes *p, and _mesa_GetIntegerv, for example, would dereference
> random junk.
>
> If the error was previously signaled, then execution shouldn't even get
> here in the ctx->Texture.CurrentUnit >=
> ARRAY_SIZE(ctx->Texture.FixedFuncUnit) case, right?
This is only used by GL_TEXTURE_GEN_* queries. It seems to be a
discrepancy in the GL spec. It's allowed to set and get the gen enables
for 192 combined texture units, but only 8 are usable in practice.
Reporting an error would be out-of-spec, returning garbage (like here)
is also out-of-spec, but it's an unusable state and therefore wasted memory.
If ARRAY_SIZE(ctx->Texture.FixedFuncUnit) ==
MAX_COMBINED_TEXTURE_IMAGE_UNITS, the condition is always true.
If ARRAY_SIZE(ctx->Texture.FixedFuncUnit) == MAX_TEXTURE_COORD_UNITS,
GetIntegerv returns garbage if active texture >= 8;
Marek
More information about the mesa-dev
mailing list