diff options
Diffstat (limited to 'mesalib/src/mesa/main/texobj.c')
-rw-r--r-- | mesalib/src/mesa/main/texobj.c | 96 |
1 files changed, 78 insertions, 18 deletions
diff --git a/mesalib/src/mesa/main/texobj.c b/mesalib/src/mesa/main/texobj.c index e99b0dc38..66377c8c0 100644 --- a/mesalib/src/mesa/main/texobj.c +++ b/mesalib/src/mesa/main/texobj.c @@ -109,7 +109,9 @@ _mesa_initialize_texture_object( struct gl_texture_object *obj, target == GL_TEXTURE_2D_ARRAY_EXT || target == GL_TEXTURE_EXTERNAL_OES || target == GL_TEXTURE_CUBE_MAP_ARRAY || - target == GL_TEXTURE_BUFFER); + target == GL_TEXTURE_BUFFER || + target == GL_TEXTURE_2D_MULTISAMPLE || + target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY); memset(obj, 0, sizeof(*obj)); /* init the non-zero fields */ @@ -166,23 +168,39 @@ static void finish_texture_init(struct gl_context *ctx, GLenum target, struct gl_texture_object *obj) { + GLenum filter = GL_LINEAR; assert(obj->Target == 0); - if (target == GL_TEXTURE_RECTANGLE_NV || - target == GL_TEXTURE_EXTERNAL_OES) { - /* have to init wrap and filter state here - kind of klunky */ - obj->Sampler.WrapS = GL_CLAMP_TO_EDGE; - obj->Sampler.WrapT = GL_CLAMP_TO_EDGE; - obj->Sampler.WrapR = GL_CLAMP_TO_EDGE; - obj->Sampler.MinFilter = GL_LINEAR; - if (ctx->Driver.TexParameter) { - static const GLfloat fparam_wrap[1] = {(GLfloat) GL_CLAMP_TO_EDGE}; - static const GLfloat fparam_filter[1] = {(GLfloat) GL_LINEAR}; - ctx->Driver.TexParameter(ctx, target, obj, GL_TEXTURE_WRAP_S, fparam_wrap); - ctx->Driver.TexParameter(ctx, target, obj, GL_TEXTURE_WRAP_T, fparam_wrap); - ctx->Driver.TexParameter(ctx, target, obj, GL_TEXTURE_WRAP_R, fparam_wrap); - ctx->Driver.TexParameter(ctx, target, obj, GL_TEXTURE_MIN_FILTER, fparam_filter); - } + switch (target) { + case GL_TEXTURE_2D_MULTISAMPLE: + case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: + filter = GL_NEAREST; + /* fallthrough */ + + case GL_TEXTURE_RECTANGLE_NV: + case GL_TEXTURE_EXTERNAL_OES: + /* have to init wrap and filter state here - kind of klunky */ + obj->Sampler.WrapS = GL_CLAMP_TO_EDGE; + obj->Sampler.WrapT = GL_CLAMP_TO_EDGE; + obj->Sampler.WrapR = GL_CLAMP_TO_EDGE; + obj->Sampler.MinFilter = filter; + obj->Sampler.MagFilter = filter; + if (ctx->Driver.TexParameter) { + static const GLfloat fparam_wrap[1] = {(GLfloat) GL_CLAMP_TO_EDGE}; + const GLfloat fparam_filter[1] = {(GLfloat) filter}; + ctx->Driver.TexParameter(ctx, target, obj, GL_TEXTURE_WRAP_S, fparam_wrap); + ctx->Driver.TexParameter(ctx, target, obj, GL_TEXTURE_WRAP_T, fparam_wrap); + ctx->Driver.TexParameter(ctx, target, obj, GL_TEXTURE_WRAP_R, fparam_wrap); + ctx->Driver.TexParameter(ctx, target, obj, + GL_TEXTURE_MIN_FILTER, fparam_filter); + ctx->Driver.TexParameter(ctx, target, obj, + GL_TEXTURE_MAG_FILTER, fparam_filter); + } + break; + + default: + /* nothing needs done */ + break; } } @@ -318,6 +336,8 @@ valid_texture_object(const struct gl_texture_object *tex) case GL_TEXTURE_BUFFER: case GL_TEXTURE_EXTERNAL_OES: case GL_TEXTURE_CUBE_MAP_ARRAY: + case GL_TEXTURE_2D_MULTISAMPLE: + case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: return GL_TRUE; case 0x99: _mesa_problem(NULL, "invalid reference to a deleted texture object"); @@ -517,6 +537,8 @@ _mesa_test_texobj_completeness( const struct gl_context *ctx, case GL_TEXTURE_RECTANGLE_NV: case GL_TEXTURE_BUFFER: case GL_TEXTURE_EXTERNAL_OES: + case GL_TEXTURE_2D_MULTISAMPLE: + case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: maxLevels = 1; /* no mipmapping */ break; default: @@ -585,7 +607,9 @@ _mesa_test_texobj_completeness( const struct gl_context *ctx, height = baseImage->Height2; depth = baseImage->Depth2; - /* Note: this loop will be a no-op for RECT, BUFFER, EXTERNAL textures */ + /* Note: this loop will be a no-op for RECT, BUFFER, EXTERNAL, + * MULTISAMPLE and MULTISAMPLE_ARRAY textures + */ for (i = baseLevel + 1; i < maxLevels; i++) { /* Compute the expected size of image at level[i] */ if (width > 1) { @@ -763,7 +787,7 @@ _mesa_get_fallback_texture(struct gl_context *ctx, gl_texture_index tex) dims = 0; target = GL_TEXTURE_BUFFER; break; - case TEXTURE_CUBE_ARRAY_INDEX: + case TEXTURE_CUBE_ARRAY_INDEX: dims = 3; target = GL_TEXTURE_CUBE_MAP_ARRAY; break; @@ -771,6 +795,14 @@ _mesa_get_fallback_texture(struct gl_context *ctx, gl_texture_index tex) dims = 2; target = GL_TEXTURE_EXTERNAL_OES; break; + case TEXTURE_2D_MULTISAMPLE_INDEX: + dims = 2; + target = GL_TEXTURE_2D_MULTISAMPLE; + break; + case TEXTURE_2D_MULTISAMPLE_ARRAY_INDEX: + dims = 3; + target = GL_TEXTURE_2D_MULTISAMPLE_ARRAY; + break; default: /* no-op */ return NULL; @@ -960,6 +992,9 @@ _mesa_GenTextures( GLsizei n, GLuint *textures ) GLuint first; GLint i; + if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) + _mesa_debug(ctx, "glGenTextures %d\n", n); + if (n < 0) { _mesa_error( ctx, GL_INVALID_VALUE, "glGenTextures" ); return; @@ -1069,6 +1104,9 @@ _mesa_DeleteTextures( GLsizei n, const GLuint *textures) GET_CURRENT_CONTEXT(ctx); GLint i; + if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) + _mesa_debug(ctx, "glDeleteTextures %d\n", n); + FLUSH_VERTICES(ctx, 0); /* too complex */ if (!textures) @@ -1156,6 +1194,12 @@ target_enum_to_index(struct gl_context *ctx, GLenum target) ? TEXTURE_EXTERNAL_INDEX : -1; case GL_TEXTURE_CUBE_MAP_ARRAY: return TEXTURE_CUBE_ARRAY_INDEX; + case GL_TEXTURE_2D_MULTISAMPLE: + return _mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_multisample + ? TEXTURE_2D_MULTISAMPLE_INDEX: -1; + case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: + return _mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_multisample + ? TEXTURE_2D_MULTISAMPLE_ARRAY_INDEX: -1; default: return -1; } @@ -1290,6 +1334,9 @@ _mesa_PrioritizeTextures( GLsizei n, const GLuint *texName, GET_CURRENT_CONTEXT(ctx); GLint i; + if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) + _mesa_debug(ctx, "glPrioritizeTextures %d\n", n); + FLUSH_VERTICES(ctx, 0); if (n < 0) { @@ -1334,6 +1381,9 @@ _mesa_AreTexturesResident(GLsizei n, const GLuint *texName, GLint i; ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); + if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) + _mesa_debug(ctx, "glAreTexturesResident %d\n", n); + if (n < 0) { _mesa_error(ctx, GL_INVALID_VALUE, "glAreTexturesResident(n)"); return GL_FALSE; @@ -1379,6 +1429,9 @@ _mesa_IsTexture( GLuint texture ) GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); + if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) + _mesa_debug(ctx, "glIsTexture %d\n", texture); + if (!texture) return GL_FALSE; @@ -1428,6 +1481,9 @@ _mesa_InvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, struct gl_texture_image *image; GET_CURRENT_CONTEXT(ctx); + if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) + _mesa_debug(ctx, "glInvalidateTexSubImage %d\n", texture); + t = invalidate_tex_image_error_check(ctx, texture, level, "glInvalidateTexSubImage"); @@ -1494,6 +1550,7 @@ _mesa_InvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, break; case GL_TEXTURE_2D_ARRAY: case GL_TEXTURE_CUBE_MAP_ARRAY: + case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: xBorder = image->Border; yBorder = image->Border; zBorder = 0; @@ -1566,6 +1623,9 @@ _mesa_InvalidateTexImage(GLuint texture, GLint level) { GET_CURRENT_CONTEXT(ctx); + if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) + _mesa_debug(ctx, "glInvalidateTexImage(%d, %d)\n", texture, level); + invalidate_tex_image_error_check(ctx, texture, level, "glInvalidateTexImage"); |