#include <stdbool.h>
#include "main/glheader.h"
#include "main/blend.h"
-#include "main/colormac.h"
#include "main/context.h"
#include "main/enums.h"
#include "main/formats.h"
static void
set_swizzle_component(GLuint *swizzle, GLuint comp, GLuint swz)
{
- ASSERT(comp < 4);
- ASSERT(swz <= SWIZZLE_NIL);
+ assert(comp < 4);
+ assert(swz <= SWIZZLE_NIL);
{
GLuint mask = 0x7 << (3 * comp);
GLuint s = (*swizzle & ~mask) | (swz << (3 * comp));
if (texObj->Target == GL_TEXTURE_RECTANGLE_ARB && params[0] != 0) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glTex%sParameter(target=%s, param=%d)", suffix,
- _mesa_lookup_enum_by_nr(texObj->Target), params[0]);
+ _mesa_enum_to_string(texObj->Target), params[0]);
return GL_FALSE;
}
incomplete(ctx, texObj);
goto invalid_pname;
case GL_DEPTH_STENCIL_TEXTURE_MODE:
- if (_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_stencil_texturing) {
+ if ((_mesa_is_desktop_gl(ctx) &&
+ ctx->Extensions.ARB_stencil_texturing) ||
+ _mesa_is_gles31(ctx)) {
bool stencil = params[0] == GL_STENCIL_INDEX;
if (!stencil && params[0] != GL_DEPTH_COMPONENT)
goto invalid_param;
"glTex%sParameter(swizzle 0x%x)", suffix, params[0]);
return GL_FALSE;
}
- ASSERT(comp < 4);
+ assert(comp < 4);
flush(ctx);
texObj->Swizzle[comp] = params[0];
invalid_pname:
_mesa_error(ctx, GL_INVALID_ENUM, "glTex%sParameter(pname=%s)",
- suffix, _mesa_lookup_enum_by_nr(pname));
+ suffix, _mesa_enum_to_string(pname));
return GL_FALSE;
invalid_param:
_mesa_error(ctx, GL_INVALID_ENUM, "glTex%sParameter(param=%s)",
- suffix, _mesa_lookup_enum_by_nr(params[0]));
+ suffix, _mesa_enum_to_string(params[0]));
return GL_FALSE;
invalid_operation:
_mesa_error(ctx, GL_INVALID_OPERATION, "glTex%sParameter(pname=%s)",
- suffix, _mesa_lookup_enum_by_nr(pname));
+ suffix, _mesa_enum_to_string(pname));
return GL_FALSE;
invalid_enum:
_mesa_error(ctx, GL_INVALID_ENUM, "glTex%sParameter(pname=%s)",
- suffix, _mesa_lookup_enum_by_nr(pname));
+ suffix, _mesa_enum_to_string(pname));
return GL_FALSE;
}
if (texObj->Sampler.MaxAnisotropy == params[0])
return GL_FALSE;
- if (params[0] < 1.0) {
+ if (params[0] < 1.0F) {
_mesa_error(ctx, GL_INVALID_VALUE, "glTex%sParameter(param)",
suffix);
return GL_FALSE;
invalid_pname:
_mesa_error(ctx, GL_INVALID_ENUM, "glTex%sParameter(pname=%s)",
- suffix, _mesa_lookup_enum_by_nr(pname));
+ suffix, _mesa_enum_to_string(pname));
return GL_FALSE;
invalid_enum:
_mesa_error(ctx, GL_INVALID_ENUM, "glTex%sParameter(pname=%s)",
- suffix, _mesa_lookup_enum_by_nr(pname));
+ suffix, _mesa_enum_to_string(pname));
return GL_FALSE;
}
legal_get_tex_level_parameter_target(struct gl_context *ctx, GLenum target,
bool dsa)
{
+ /* Common targets for desktop GL and GLES 3.1. */
switch (target) {
- case GL_TEXTURE_1D:
- case GL_PROXY_TEXTURE_1D:
case GL_TEXTURE_2D:
- case GL_PROXY_TEXTURE_2D:
case GL_TEXTURE_3D:
- case GL_PROXY_TEXTURE_3D:
return GL_TRUE;
+ case GL_TEXTURE_2D_ARRAY_EXT:
+ return ctx->Extensions.EXT_texture_array;
case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB:
+ return ctx->Extensions.ARB_texture_cube_map;
+ case GL_TEXTURE_2D_MULTISAMPLE:
+ case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
+ return ctx->Extensions.ARB_texture_multisample;
+ }
+
+ if (!_mesa_is_desktop_gl(ctx))
+ return GL_FALSE;
+
+ /* Rest of the desktop GL targets. */
+ switch (target) {
+ case GL_TEXTURE_1D:
+ case GL_PROXY_TEXTURE_1D:
+ case GL_PROXY_TEXTURE_2D:
+ case GL_PROXY_TEXTURE_3D:
+ return GL_TRUE;
case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
return ctx->Extensions.ARB_texture_cube_map;
case GL_TEXTURE_CUBE_MAP_ARRAY_ARB:
return ctx->Extensions.NV_texture_rectangle;
case GL_TEXTURE_1D_ARRAY_EXT:
case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
- case GL_TEXTURE_2D_ARRAY_EXT:
case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
return ctx->Extensions.EXT_texture_array;
case GL_TEXTURE_BUFFER:
* "target may also be TEXTURE_BUFFER, indicating the texture buffer."
*/
return ctx->API == API_OPENGL_CORE && ctx->Version >= 31;
- case GL_TEXTURE_2D_MULTISAMPLE:
- case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
case GL_PROXY_TEXTURE_2D_MULTISAMPLE:
case GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY:
return ctx->Extensions.ARB_texture_multisample;
else {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glGetTex%sLevelParameter[if]v(pname=%s)", suffix,
- _mesa_lookup_enum_by_nr(pname));
+ _mesa_enum_to_string(pname));
}
break;
case GL_TEXTURE_COMPRESSED:
invalid_pname:
_mesa_error(ctx, GL_INVALID_ENUM,
"glGetTex%sLevelParameter[if]v(pname=%s)", suffix,
- _mesa_lookup_enum_by_nr(pname));
+ _mesa_enum_to_string(pname));
}
/* Always illegal for GL_TEXTURE_BUFFER */
_mesa_error(ctx, GL_INVALID_OPERATION,
"glGetTex%sLevelParameter[if]v(pname=%s)", suffix,
- _mesa_lookup_enum_by_nr(pname));
+ _mesa_enum_to_string(pname));
break;
/* GL_ARB_texture_float */
invalid_pname:
_mesa_error(ctx, GL_INVALID_ENUM,
"glGetTex%sLevelParameter[if]v(pname=%s)", suffix,
- _mesa_lookup_enum_by_nr(pname));
+ _mesa_enum_to_string(pname));
}
+static bool
+valid_tex_level_parameteriv_target(struct gl_context *ctx, GLenum target,
+ bool dsa)
+{
+ const char *suffix = dsa ? "ture" : "";
+ if (!legal_get_tex_level_parameter_target(ctx, target, dsa)) {
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glGetTex%sLevelParameter[if]v(target=%s)", suffix,
+ _mesa_enum_to_string(target));
+ return false;
+ }
+ return true;
+}
/**
* This isn't exposed to the rest of the driver because it is a part of the
return;
}
- if (!legal_get_tex_level_parameter_target(ctx, target, dsa)) {
- _mesa_error(ctx, GL_INVALID_ENUM,
- "glGetTex%sLevelParameter[if]v(target=%s)", suffix,
- _mesa_lookup_enum_by_nr(target));
- return;
- }
-
maxLevels = _mesa_max_texture_levels(ctx, target);
assert(maxLevels != 0);
GLint iparam;
GET_CURRENT_CONTEXT(ctx);
+ if (!valid_tex_level_parameteriv_target(ctx, target, false))
+ return;
+
texObj = _mesa_get_current_tex_object(ctx, target);
if (!texObj)
return;
struct gl_texture_object *texObj;
GET_CURRENT_CONTEXT(ctx);
+ if (!valid_tex_level_parameteriv_target(ctx, target, false))
+ return;
+
texObj = _mesa_get_current_tex_object(ctx, target);
if (!texObj)
return;
if (!texObj)
return;
+ if (!valid_tex_level_parameteriv_target(ctx, texObj->Target, true))
+ return;
+
get_tex_level_parameteriv(ctx, texObj, texObj->Target, level,
pname, &iparam, true);
if (!texObj)
return;
+ if (!valid_tex_level_parameteriv_target(ctx, texObj->Target, true))
+ return;
+
get_tex_level_parameteriv(ctx, texObj, texObj->Target, level,
pname, params, true);
}
if (ctx->NewState & (_NEW_BUFFERS | _NEW_FRAG_CLAMP))
_mesa_update_state_locked(ctx);
- if (_mesa_get_clamp_fragment_color(ctx)) {
+ if (_mesa_get_clamp_fragment_color(ctx, ctx->DrawBuffer)) {
params[0] = CLAMP(obj->Sampler.BorderColor.f[0], 0.0F, 1.0F);
params[1] = CLAMP(obj->Sampler.BorderColor.f[1], 0.0F, 1.0F);
params[2] = CLAMP(obj->Sampler.BorderColor.f[2], 0.0F, 1.0F);
*params = (GLfloat) obj->Sampler.sRGBDecode;
break;
+ case GL_IMAGE_FORMAT_COMPATIBILITY_TYPE:
+ if (!ctx->Extensions.ARB_shader_image_load_store)
+ goto invalid_pname;
+ *params = (GLfloat) obj->ImageFormatCompatibilityType;
+ break;
+
+ case GL_TEXTURE_TARGET:
+ if (ctx->API != API_OPENGL_CORE)
+ goto invalid_pname;
+ *params = ENUM_TO_FLOAT(obj->Target);
+ break;
+
default:
goto invalid_pname;
}
case GL_TEXTURE_MIN_LOD:
if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
goto invalid_pname;
-
- *params = (GLint) obj->Sampler.MinLod;
+ /* GL spec 'Data Conversions' section specifies that floating-point
+ * value in integer Get function is rounded to nearest integer
+ */
+ *params = IROUND(obj->Sampler.MinLod);
break;
case GL_TEXTURE_MAX_LOD:
if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
goto invalid_pname;
-
- *params = (GLint) obj->Sampler.MaxLod;
+ /* GL spec 'Data Conversions' section specifies that floating-point
+ * value in integer Get function is rounded to nearest integer
+ */
+ *params = IROUND(obj->Sampler.MaxLod);
break;
case GL_TEXTURE_BASE_LEVEL:
if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
if (!ctx->Extensions.EXT_texture_filter_anisotropic)
goto invalid_pname;
- *params = (GLint) obj->Sampler.MaxAnisotropy;
+ /* GL spec 'Data Conversions' section specifies that floating-point
+ * value in integer Get function is rounded to nearest integer
+ */
+ *params = IROUND(obj->Sampler.MaxAnisotropy);
break;
case GL_GENERATE_MIPMAP_SGIS:
if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
*params = obj->ImageFormatCompatibilityType;
break;
+ case GL_TEXTURE_TARGET:
+ if (ctx->API != API_OPENGL_CORE)
+ goto invalid_pname;
+ *params = (GLint) obj->Target;
+ break;
+
default:
goto invalid_pname;
}