X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Ftexobj.c;h=e018ab9103c2c18149b7b40bc8dc42b5a57d44ca;hb=db29869205ecc2d7254698daac3e9027f6c92619;hp=6e5eb7398f11342d2ea2a312cf212486e64eb957;hpb=b66dd38a37807c28203aa5c6c2707c1dc6dccedf;p=mesa.git diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c index 6e5eb7398f1..e018ab9103c 100644 --- a/src/mesa/main/texobj.c +++ b/src/mesa/main/texobj.c @@ -28,6 +28,7 @@ */ +#include #include "bufferobj.h" #include "colortab.h" #include "context.h" @@ -49,6 +50,54 @@ /** \name Internal functions */ /*@{*/ +/** + * This function checks for all valid combinations of Min and Mag filters for + * Float types, when extensions like OES_texture_float and + * OES_texture_float_linear are supported. OES_texture_float mentions support + * for NEAREST, NEAREST_MIPMAP_NEAREST magnification and minification filters. + * Mag filters like LINEAR and min filters like NEAREST_MIPMAP_LINEAR, + * LINEAR_MIPMAP_NEAREST and LINEAR_MIPMAP_LINEAR are only valid in case + * OES_texture_float_linear is supported. + * + * Returns true in case the filter is valid for given Float type else false. + */ +static bool +valid_filter_for_float(const struct gl_context *ctx, + const struct gl_texture_object *obj) +{ + switch (obj->Sampler.MagFilter) { + case GL_LINEAR: + if (obj->_IsHalfFloat && !ctx->Extensions.OES_texture_half_float_linear) { + return false; + } else if (obj->_IsFloat && !ctx->Extensions.OES_texture_float_linear) { + return false; + } + case GL_NEAREST: + case GL_NEAREST_MIPMAP_NEAREST: + break; + default: + unreachable("Invalid mag filter"); + } + + switch (obj->Sampler.MinFilter) { + case GL_LINEAR: + case GL_NEAREST_MIPMAP_LINEAR: + case GL_LINEAR_MIPMAP_NEAREST: + case GL_LINEAR_MIPMAP_LINEAR: + if (obj->_IsHalfFloat && !ctx->Extensions.OES_texture_half_float_linear) { + return false; + } else if (obj->_IsFloat && !ctx->Extensions.OES_texture_float_linear) { + return false; + } + case GL_NEAREST: + case GL_NEAREST_MIPMAP_NEAREST: + break; + default: + unreachable("Invalid min filter"); + } + + return true; +} /** * Return the gl_texture_object for a given ID. @@ -217,7 +266,7 @@ _mesa_initialize_texture_object( struct gl_context *ctx, struct gl_texture_object *obj, GLuint name, GLenum target ) { - ASSERT(target == 0 || + assert(target == 0 || target == GL_TEXTURE_1D || target == GL_TEXTURE_2D || target == GL_TEXTURE_3D || @@ -408,6 +457,8 @@ _mesa_copy_texture_object( struct gl_texture_object *dest, dest->_MipmapComplete = src->_MipmapComplete; COPY_4V(dest->Swizzle, src->Swizzle); dest->_Swizzle = src->_Swizzle; + dest->_IsHalfFloat = src->_IsHalfFloat; + dest->_IsFloat = src->_IsFloat; dest->RequiredTextureImageUnits = src->RequiredTextureImageUnits; } @@ -491,11 +542,11 @@ _mesa_reference_texobj_(struct gl_texture_object **ptr, GLboolean deleteFlag = GL_FALSE; struct gl_texture_object *oldTex = *ptr; - ASSERT(valid_texture_object(oldTex)); + assert(valid_texture_object(oldTex)); (void) valid_texture_object; /* silence warning in release builds */ mtx_lock(&oldTex->Mutex); - ASSERT(oldTex->RefCount > 0); + assert(oldTex->RefCount > 0); oldTex->RefCount--; deleteFlag = (oldTex->RefCount == 0); @@ -518,7 +569,7 @@ _mesa_reference_texobj_(struct gl_texture_object **ptr, if (tex) { /* reference new texture */ - ASSERT(valid_texture_object(tex)); + assert(valid_texture_object(tex)); mtx_lock(&tex->Mutex); if (tex->RefCount == 0) { /* this texture's being deleted (look just above) */ @@ -641,6 +692,14 @@ _mesa_test_texobj_completeness( const struct gl_context *ctx, t->_IsIntegerFormat = datatype == GL_INT || datatype == GL_UNSIGNED_INT; } + /* Check if the texture type is Float or HalfFloatOES and ensure Min and Mag + * filters are supported in this case. + */ + if (_mesa_is_gles(ctx) && !valid_filter_for_float(ctx, t)) { + incomplete(t, BASE, "Filter is not supported with Float types."); + return; + } + /* Compute _MaxLevel (the maximum mipmap level we'll sample from given the * mipmap image sizes and GL_TEXTURE_MAX_LEVEL state). */ @@ -672,7 +731,7 @@ _mesa_test_texobj_completeness( const struct gl_context *ctx, return; } - ASSERT(maxLevels > 0); + assert(maxLevels > 0); t->_MaxLevel = MIN3(t->MaxLevel, /* 'p' in the GL spec */ @@ -1406,6 +1465,11 @@ _mesa_DeleteTextures( GLsizei n, const GLuint *textures) if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) _mesa_debug(ctx, "glDeleteTextures %d\n", n); + if (n < 0) { + _mesa_error(ctx, GL_INVALID_VALUE, "glDeleteTextures(n < 0)"); + return; + } + FLUSH_VERTICES(ctx, 0); /* too complex */ if (n < 0) { @@ -1661,7 +1725,7 @@ _mesa_BindTexture( GLenum target, GLuint texName ) _mesa_reference_texobj(&texUnit->CurrentTex[targetIndex], newTexObj); ctx->Texture.NumCurrentTexUsed = MAX2(ctx->Texture.NumCurrentTexUsed, ctx->Texture.CurrentUnit + 1); - ASSERT(texUnit->CurrentTex[targetIndex]); + assert(texUnit->CurrentTex[targetIndex]); if (texName != 0) texUnit->_BoundTextures |= (1 << targetIndex); @@ -1710,7 +1774,7 @@ _mesa_bind_texture_unit(struct gl_context *ctx, _mesa_reference_texobj(&texUnit->CurrentTex[texObj->TargetIndex], texObj); - ASSERT(texUnit->CurrentTex[texObj->TargetIndex]); + assert(texUnit->CurrentTex[texObj->TargetIndex]); ctx->Texture.NumCurrentTexUsed = MAX2(ctx->Texture.NumCurrentTexUsed, unit + 1); texUnit->_BoundTextures |= (1 << texObj->TargetIndex);