mesa: add EXT_dsa glEnabledIndexedEXT
authorPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Fri, 26 Apr 2019 14:50:57 +0000 (16:50 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Sat, 20 Jul 2019 00:04:07 +0000 (20:04 -0400)
The implementation uses _mesa_ActiveTexture to change the active texture unit and
then reset it.

It causes an unnecessary _NEW_TEXTURE_STATE but:
  - adding an index argument to _mesa_set_enable causes a lot of changes (~140 callers)
  - enable_texture (called by _mesa_set_enable) might cause a _NEW_TEXTURE_STATE
    anyway.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/mesa/main/enable.c
src/mesa/main/get.c

index c4c3a0c..ffdd3d8 100644 (file)
@@ -1246,6 +1246,28 @@ _mesa_set_enablei(struct gl_context *ctx, GLenum cap,
             ctx->Scissor.EnableFlags &= ~(1 << index);
       }
       break;
+   /* EXT_direct_state_access */
+   case GL_TEXTURE_1D:
+   case GL_TEXTURE_2D:
+   case GL_TEXTURE_3D:
+   case GL_TEXTURE_CUBE_MAP:
+   case GL_TEXTURE_GEN_S:
+   case GL_TEXTURE_GEN_T:
+   case GL_TEXTURE_GEN_R:
+   case GL_TEXTURE_GEN_Q:
+   case GL_TEXTURE_RECTANGLE_ARB: {
+      const GLuint curTexUnitSave = ctx->Texture.CurrentUnit;
+      if (index >= MAX2(ctx->Const.MaxCombinedTextureImageUnits,
+                        ctx->Const.MaxTextureCoordUnits)) {
+         _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)",
+                     state ? "glEnablei" : "glDisablei", index);
+         return;
+      }
+      _mesa_ActiveTexture(GL_TEXTURE0 + index);
+      _mesa_set_enable( ctx, cap, state );
+      _mesa_ActiveTexture(GL_TEXTURE0 + curTexUnitSave);
+      break;
+   }
    default:
       goto invalid_enum_error;
    }
@@ -1294,6 +1316,29 @@ _mesa_IsEnabledi( GLenum cap, GLuint index )
          return GL_FALSE;
       }
       return (ctx->Scissor.EnableFlags >> index) & 1;
+   /* EXT_direct_state_access */
+   case GL_TEXTURE_1D:
+   case GL_TEXTURE_2D:
+   case GL_TEXTURE_3D:
+   case GL_TEXTURE_CUBE_MAP:
+   case GL_TEXTURE_GEN_S:
+   case GL_TEXTURE_GEN_T:
+   case GL_TEXTURE_GEN_R:
+   case GL_TEXTURE_GEN_Q:
+   case GL_TEXTURE_RECTANGLE_ARB: {
+      GLboolean state;
+      const GLuint curTexUnitSave = ctx->Texture.CurrentUnit;
+      if (index >= MAX2(ctx->Const.MaxCombinedTextureImageUnits,
+                        ctx->Const.MaxTextureCoordUnits)) {
+         _mesa_error(ctx, GL_INVALID_VALUE, "glIsEnabledIndexed(index=%u)",
+                     index);
+         return GL_FALSE;
+      }
+      _mesa_ActiveTexture(GL_TEXTURE0 + index);
+      state = _mesa_IsEnabled(cap);
+      _mesa_ActiveTexture(GL_TEXTURE0 + curTexUnitSave);
+      return state;
+   }
    default:
       _mesa_error(ctx, GL_INVALID_ENUM, "glIsEnabledIndexed(cap=%s)",
                   _mesa_enum_to_string(cap));
index 3fbacb3..f213002 100644 (file)
@@ -2742,6 +2742,35 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
          goto invalid_value;
       _mesa_get_device_uuid(ctx, v->value_int_4);
       return TYPE_INT_4;
+   /* GL_EXT_direct_state_access */
+   case GL_TEXTURE_1D:
+   case GL_TEXTURE_2D:
+   case GL_TEXTURE_3D:
+   case GL_TEXTURE_CUBE_MAP:
+   case GL_TEXTURE_GEN_S:
+   case GL_TEXTURE_GEN_T:
+   case GL_TEXTURE_GEN_R:
+   case GL_TEXTURE_GEN_Q:
+   case GL_TEXTURE_RECTANGLE_ARB: {
+      GLuint curTexUnitSave;
+      if (index >= _mesa_max_tex_unit(ctx))
+         goto invalid_enum;
+      curTexUnitSave = ctx->Texture.CurrentUnit;
+      _mesa_ActiveTexture_no_error(GL_TEXTURE0 + index);
+      v->value_int = _mesa_IsEnabled(pname);
+      _mesa_ActiveTexture_no_error(GL_TEXTURE0 + curTexUnitSave);
+      return TYPE_INT;
+   }
+   case GL_TEXTURE_COORD_ARRAY: {
+      GLuint curTexUnitSave;
+      if (index >= ctx->Const.MaxTextureCoordUnits)
+         goto invalid_enum;
+      curTexUnitSave = ctx->Array.ActiveTexture;
+      _mesa_ClientActiveTexture(GL_TEXTURE0 + index);
+      v->value_int = _mesa_IsEnabled(pname);
+      _mesa_ClientActiveTexture(GL_TEXTURE0 + curTexUnitSave);
+      return TYPE_INT;
+   }
    }
 
  invalid_enum: