[Mesa-dev] [PATCH 3/7] mesa: implement glBindTextures()
Ian Romanick
idr at freedesktop.org
Mon Jan 13 14:08:32 PST 2014
On 01/07/2014 12:05 AM, Fredrik Höglund wrote:
> On Friday 03 January 2014, Marek Olšák wrote:
>> On Fri, Jan 3, 2014 at 2:04 PM, Marek Olšák <maraeo at gmail.com> wrote:
>>> On Fri, Jan 3, 2014 at 1:27 AM, Maxence Le Doré
>>> <maxence.ledore at gmail.com> wrote:
>>>> ---
>>>> src/mesa/main/texobj.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++
>>>> src/mesa/main/texobj.h | 3 +++
>>>> 2 files changed, 55 insertions(+)
>>>>
>>>> diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c
>>>> index bddbc50..66e2fb0 100644
>>>> --- a/src/mesa/main/texobj.c
>>>> +++ b/src/mesa/main/texobj.c
>>>> @@ -1686,4 +1686,56 @@ _mesa_InvalidateTexImage(GLuint texture, GLint level)
>>>> return;
>>>> }
>>>>
>>>> +/** ARB_multi_bind / OpenGL 4.4 */
>>>> +
>>>> +void GLAPIENTRY
>>>> +_mesa_BindTextures(GLuint first, GLsizei count, const GLuint *textures)
>>>> +{
>>>> + GET_CURRENT_CONTEXT(ctx);
>>>> + struct GLuint currentTexUnit = 0;
>>>> + int i = 0;
>>>> +
>>>> + currentTexUnit = ctx->Texture.CurrentUnit;
>>>> +
>>>> + if(first + count > ctx->Const.MaxCombinedTextureImageUnits) {
>>>> + _mesa_error(ctx, GL_INVALID_OPERATION, "glBindTextures(first+count)");
>>>> + return;
>>>> + }
>>>> +
>>>> + for(i = 0 ; i < count ; i++) {
>>>> + GLuint texture;
>>>> + struct gl_texture_object *texObj;
>>>> + GLenum texTarget;
>>>> + int j = 0;
>>>> +
>>>> + if(textures == NULL)
>>>> + texture = 0;
>>>> + else
>>>> + texture = textures[i];
>>>> +
>>>> + _mesa_ActiveTexture(GL_TEXTURE0 + first + i);
>>>> + if(texture != 0) {
>>>> + texObj = _mesa_lookup_texture(ctx, texture);
>>>> + if(texObj) {
>>>> + texTarget = texObj->Target;
>>>> + _mesa_BindTexture(texTarget, texture);
>>>> + }
>>>> + else
>>>> + _mesa_error(ctx, GL_INVALID_OPERATION,
>>>> + "glBindTextures(textures[%i])", i);
>>>
>>> This error is set too late. It should be done before changing textures.
>>
>> Note that you make the same mistake in the other patches too. Also
>> please double-check that none of the _mesa_ functions generate errors.
>
> This is actually not the case with the ARB_multi_bind functions:
>
> (11) Typically, OpenGL specifies that if an error is generated by a
> command, that command has no effect. This is somewhat unfortunate
> for multi-bind commands, because it would require a first pass to
> scan the entire list of bound objects for errors and then a second
> pass to actually perform the bindings. Should we have different
> error semantics?
>
> RESOLVED: Yes. In this specification, when the parameters for one of
> the <count> binding points are invalid, that binding point is not
> updated and an error will be generated. However, other binding points
> in the same command will be updated if their parameters are valid and no
> other error occurs.
The code should reference this spec text. Otherwise someone will come
along later and try to "fix" it.
> The code is still wrong for a different reason though; when a texture has
> has never been bound, it doesn't have a target. That case needs to be
> handled correctly.
>
> Fredrik
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list