mesa: fix glPopAttrib for many texture fields

Move the fields that should be restored by glPopAttrib into the Attrib
structure, which is the only portion of texture objects that is restored
by glPopAttrib. Also moves fields that should not be restored by glPopAttrib
out of the Attrib structure.

This is based on the GL 4.6 Compatibility spec.

Reviewed-by: Zoltán Böszörményi <zboszor@gmail.com>
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8181>
This commit is contained in:
Marek Olšák
2020-12-19 01:19:35 -05:00
parent 230b46bcee
commit 35be83846e
27 changed files with 159 additions and 148 deletions

View File

@@ -1925,10 +1925,10 @@ dri2_interop_export_object(__DRIcontext *_ctx,
}
out->internal_format = obj->Image[0][0]->InternalFormat;
out->view_minlevel = obj->MinLevel;
out->view_numlevels = obj->NumLevels;
out->view_minlayer = obj->MinLayer;
out->view_numlayers = obj->NumLayers;
out->view_minlevel = obj->Attrib.MinLevel;
out->view_numlevels = obj->Attrib.NumLevels;
out->view_minlayer = obj->Attrib.MinLayer;
out->view_numlayers = obj->Attrib.NumLayers;
}
}

View File

@@ -178,7 +178,7 @@ blitframebuffer_texture(struct gl_context *ctx,
fb_tex_blit.tex_obj = texObj;
fb_tex_blit.baseLevelSave = texObj->Attrib.BaseLevel;
fb_tex_blit.maxLevelSave = texObj->Attrib.MaxLevel;
fb_tex_blit.stencilSamplingSave = texObj->Attrib.StencilSampling;
fb_tex_blit.stencilSamplingSave = texObj->StencilSampling;
if (glsl_version) {
setup_glsl_blit_framebuffer(ctx, blit, drawFb, rb, target, do_depth);
@@ -338,7 +338,7 @@ _mesa_meta_fb_tex_blit_end(struct gl_context *ctx, GLenum target,
&blit->maxLevelSave, false);
/* If ARB_stencil_texturing is not supported, the mode won't have changed. */
if (texObj->Attrib.StencilSampling != blit->stencilSamplingSave) {
if (texObj->StencilSampling != blit->stencilSamplingSave) {
/* GLint so the compiler won't complain about type signedness mismatch
* in the call to _mesa_texture_parameteriv below.
*/

View File

@@ -745,8 +745,8 @@ brw_blorp_copytexsubimage(struct brw_context *brw,
apply_y_flip(&srcY0, &srcY1, src_rb->Height);
/* Account for face selection and texture view MinLayer */
int dst_slice = slice + dst_image->TexObject->MinLayer + dst_image->Face;
int dst_level = dst_image->Level + dst_image->TexObject->MinLevel;
int dst_slice = slice + dst_image->TexObject->Attrib.MinLayer + dst_image->Face;
int dst_level = dst_image->Level + dst_image->TexObject->Attrib.MinLevel;
brw_blorp_blit_miptrees(brw,
src_mt, src_irb->mt_level, src_irb->mt_layer,

View File

@@ -547,11 +547,11 @@ brw_predraw_resolve_inputs(struct brw_context *brw, bool rendering,
unsigned min_level, min_layer, num_levels, num_layers;
if (tex_obj->base.Immutable) {
min_level = tex_obj->base.MinLevel;
num_levels = MIN2(tex_obj->base.NumLevels, tex_obj->_MaxLevel + 1);
min_layer = tex_obj->base.MinLayer;
min_level = tex_obj->base.Attrib.MinLevel;
num_levels = MIN2(tex_obj->base.Attrib.NumLevels, tex_obj->_MaxLevel + 1);
min_layer = tex_obj->base.Attrib.MinLayer;
num_layers = tex_obj->base.Target != GL_TEXTURE_3D ?
tex_obj->base.NumLayers : INTEL_REMAINING_LAYERS;
tex_obj->base.Attrib.NumLayers : INTEL_REMAINING_LAYERS;
} else {
min_level = tex_obj->base.Attrib.BaseLevel;
num_levels = tex_obj->_MaxLevel - tex_obj->base.Attrib.BaseLevel + 1;
@@ -586,7 +586,7 @@ brw_predraw_resolve_inputs(struct brw_context *brw, bool rendering,
brw_cache_flush_for_read(brw, tex_obj->mt->bo);
if (tex_obj->base.Attrib.StencilSampling ||
if (tex_obj->base.StencilSampling ||
tex_obj->mt->format == MESA_FORMAT_S_UINT8) {
intel_update_r8stencil(brw, tex_obj->mt);
}

View File

@@ -491,7 +491,7 @@ static void brw_update_texture_surface(struct gl_context *ctx,
*/
unsigned view_num_layers;
if (obj->Immutable && obj->Target != GL_TEXTURE_3D) {
view_num_layers = obj->NumLayers;
view_num_layers = obj->Attrib.NumLayers;
} else {
view_num_layers = mt->surf.dim == ISL_SURF_DIM_3D ?
mt->surf.logical_level0_px.depth :
@@ -566,7 +566,7 @@ static void brw_update_texture_surface(struct gl_context *ctx,
}
}
if (obj->Attrib.StencilSampling && firstImage->_BaseFormat == GL_DEPTH_STENCIL) {
if (obj->StencilSampling && firstImage->_BaseFormat == GL_DEPTH_STENCIL) {
if (devinfo->gen <= 7) {
assert(mt->shadow_mt && !mt->stencil_mt->shadow_needs_update);
mt = mt->shadow_mt;
@@ -587,9 +587,9 @@ static void brw_update_texture_surface(struct gl_context *ctx,
struct isl_view view = {
.format = format,
.base_level = obj->MinLevel + obj->Attrib.BaseLevel,
.base_level = obj->Attrib.MinLevel + obj->Attrib.BaseLevel,
.levels = intel_obj->_MaxLevel - obj->Attrib.BaseLevel + 1,
.base_array_layer = obj->MinLayer,
.base_array_layer = obj->Attrib.MinLayer,
.array_len = view_num_layers,
.swizzle = {
.r = swizzle_to_scs(GET_SWZ(swizzle, 0), need_green_to_blue),
@@ -1151,7 +1151,7 @@ is_depth_texture(struct intel_texture_object *iobj)
{
GLenum base_format = _mesa_get_format_base_format(iobj->_Format);
return base_format == GL_DEPTH_COMPONENT ||
(base_format == GL_DEPTH_STENCIL && !iobj->base.Attrib.StencilSampling);
(base_format == GL_DEPTH_STENCIL && !iobj->base.StencilSampling);
}
static void
@@ -1550,20 +1550,20 @@ update_image_surface(struct brw_context *brw,
base_layer = 0;
num_layers = minify(mt->surf.logical_level0_px.depth, u->Level);
} else {
assert(obj->Immutable || obj->MinLayer == 0);
base_layer = obj->MinLayer;
assert(obj->Immutable || obj->Attrib.MinLayer == 0);
base_layer = obj->Attrib.MinLayer;
num_layers = obj->Immutable ?
obj->NumLayers :
obj->Attrib.NumLayers :
mt->surf.logical_level0_px.array_len;
}
} else {
base_layer = obj->MinLayer + u->_Layer;
base_layer = obj->Attrib.MinLayer + u->_Layer;
num_layers = 1;
}
struct isl_view view = {
.format = format,
.base_level = obj->MinLevel + u->Level,
.base_level = obj->Attrib.MinLevel + u->Level,
.levels = 1,
.base_array_layer = base_layer,
.array_len = num_layers,

View File

@@ -5321,7 +5321,7 @@ genX(update_sampler_state)(struct brw_context *brw,
#if GEN_GEN == 6
samp_st.BaseMipLevel =
CLAMP(texObj->MinLevel + texObj->Attrib.BaseLevel, 0, hw_max_lod);
CLAMP(texObj->Attrib.MinLevel + texObj->Attrib.BaseLevel, 0, hw_max_lod);
samp_st.MinandMagStateNotEqual =
samp_st.MinModeFilter != samp_st.MagModeFilter;
#endif
@@ -5336,7 +5336,7 @@ genX(update_sampler_state)(struct brw_context *brw,
wrap_mode_needs_border_color(wrap_r)) {
genX(upload_default_color)(brw, sampler, format, base_format,
texObj->_IsIntegerFormat,
texObj->Attrib.StencilSampling,
texObj->StencilSampling,
&border_color_offset);
}
#if GEN_GEN < 6

View File

@@ -81,13 +81,13 @@ intel_copy_image_sub_data(struct gl_context *ctx,
if (src_image) {
src_mt = intel_texture_image(src_image)->mt;
src_level = src_image->Level + src_image->TexObject->MinLevel;
src_level = src_image->Level + src_image->TexObject->Attrib.MinLevel;
/* Cube maps actually have different images per face */
if (src_image->TexObject->Target == GL_TEXTURE_CUBE_MAP)
src_z = src_image->Face;
src_z += src_image->TexObject->MinLayer;
src_z += src_image->TexObject->Attrib.MinLayer;
} else {
assert(src_renderbuffer);
src_mt = intel_renderbuffer(src_renderbuffer)->mt;
@@ -98,13 +98,13 @@ intel_copy_image_sub_data(struct gl_context *ctx,
if (dst_image) {
dst_mt = intel_texture_image(dst_image)->mt;
dst_level = dst_image->Level + dst_image->TexObject->MinLevel;
dst_level = dst_image->Level + dst_image->TexObject->Attrib.MinLevel;
/* Cube maps actually have different images per face */
if (dst_image->TexObject->Target == GL_TEXTURE_CUBE_MAP)
dst_z = dst_image->Face;
dst_z += dst_image->TexObject->MinLayer;
dst_z += dst_image->TexObject->Attrib.MinLayer;
} else {
assert(dst_renderbuffer);
dst_mt = intel_renderbuffer(dst_renderbuffer)->mt;

View File

@@ -540,8 +540,8 @@ intel_renderbuffer_update_wrapper(struct brw_context *brw,
rb->AllocStorage = intel_nop_alloc_storage;
/* adjust for texture view parameters */
layer += image->TexObject->MinLayer;
level += image->TexObject->MinLevel;
layer += image->TexObject->Attrib.MinLayer;
level += image->TexObject->Attrib.MinLevel;
intel_miptree_check_level_layer(mt, level, layer);
irb->mt_level = level;
@@ -549,8 +549,8 @@ intel_renderbuffer_update_wrapper(struct brw_context *brw,
if (!layered) {
irb->layer_count = 1;
} else if (mt->target != GL_TEXTURE_3D && image->TexObject->NumLayers > 0) {
irb->layer_count = image->TexObject->NumLayers;
} else if (mt->target != GL_TEXTURE_3D && image->TexObject->Attrib.NumLayers > 0) {
irb->layer_count = image->TexObject->Attrib.NumLayers;
} else {
irb->layer_count = mt->surf.dim == ISL_SURF_DIM_3D ?
minify(mt->surf.logical_level0_px.depth, level) :

View File

@@ -231,8 +231,8 @@ intel_map_texture_image(struct gl_context *ctx,
slice = tex_image->Face;
intel_miptree_map(brw, mt,
tex_image->Level + tex_image->TexObject->MinLevel,
slice + tex_image->TexObject->MinLayer,
tex_image->Level + tex_image->TexObject->Attrib.MinLevel,
slice + tex_image->TexObject->Attrib.MinLayer,
x, y, w, h, mode,
(void **)map, &stride);
@@ -251,8 +251,8 @@ intel_unmap_texture_image(struct gl_context *ctx,
slice = tex_image->Face;
intel_miptree_unmap(brw, mt,
tex_image->Level + tex_image->TexObject->MinLevel,
slice + tex_image->TexObject->MinLayer);
tex_image->Level + tex_image->TexObject->Attrib.MinLevel,
slice + tex_image->TexObject->Attrib.MinLayer);
}
static GLboolean
@@ -274,7 +274,7 @@ intel_texture_view(struct gl_context *ctx,
* except it hasn't copied our mt pointers, etc.
*/
const int numFaces = _mesa_num_tex_faces(texObj->Target);
const int numLevels = texObj->NumLevels;
const int numLevels = texObj->Attrib.NumLevels;
int face;
int level;

View File

@@ -136,8 +136,8 @@ intel_texsubimage_blorp(struct brw_context *brw, GLuint dims,
const struct gl_pixelstore_attrib *packing)
{
struct intel_texture_image *intel_image = intel_texture_image(tex_image);
const unsigned mt_level = tex_image->Level + tex_image->TexObject->MinLevel;
const unsigned mt_z = tex_image->TexObject->MinLayer + tex_image->Face + z;
const unsigned mt_level = tex_image->Level + tex_image->TexObject->Attrib.MinLevel;
const unsigned mt_z = tex_image->TexObject->Attrib.MinLayer + tex_image->Face + z;
/* The blorp path can't understand crazy format hackery */
if (_mesa_base_tex_format(&brw->ctx, tex_image->InternalFormat) !=
@@ -228,7 +228,7 @@ intel_texsubimage_tiled_memcpy(struct gl_context * ctx,
return false;
/* If this is a nontrivial texture view, let another path handle it instead. */
if (texImage->TexObject->MinLayer)
if (texImage->TexObject->Attrib.MinLayer)
return false;
if (!image->mt ||
@@ -249,7 +249,7 @@ intel_texsubimage_tiled_memcpy(struct gl_context * ctx,
if (devinfo->gen < 5 && brw->has_swizzling)
return false;
int level = texImage->Level + texImage->TexObject->MinLevel;
int level = texImage->Level + texImage->TexObject->Attrib.MinLevel;
/* Since we are going to write raw data to the miptree, we need to resolve
* any pending fast color clears before we start.
@@ -702,8 +702,8 @@ intel_gettexsubimage_blorp(struct brw_context *brw,
const struct gl_pixelstore_attrib *packing)
{
struct intel_texture_image *intel_image = intel_texture_image(tex_image);
const unsigned mt_level = tex_image->Level + tex_image->TexObject->MinLevel;
const unsigned mt_z = tex_image->TexObject->MinLayer + tex_image->Face + z;
const unsigned mt_level = tex_image->Level + tex_image->TexObject->Attrib.MinLevel;
const unsigned mt_z = tex_image->TexObject->Attrib.MinLayer + tex_image->Face + z;
/* The blorp path can't understand crazy format hackery */
if (_mesa_base_tex_format(&brw->ctx, tex_image->InternalFormat) !=
@@ -781,7 +781,7 @@ intel_gettexsubimage_tiled_memcpy(struct gl_context *ctx,
return false;
/* If this is a nontrivial texture view, let another path handle it instead. */
if (texImage->TexObject->MinLayer)
if (texImage->TexObject->Attrib.MinLayer)
return false;
if (!image->mt ||
@@ -802,7 +802,7 @@ intel_gettexsubimage_tiled_memcpy(struct gl_context *ctx,
if (devinfo->gen < 5 && brw->has_swizzling)
return false;
int level = texImage->Level + texImage->TexObject->MinLevel;
int level = texImage->Level + texImage->TexObject->Attrib.MinLevel;
/* Since we are going to write raw data to the miptree, we need to resolve
* any pending fast color clears before we start.

View File

@@ -3710,7 +3710,7 @@ check_level(struct gl_context *ctx, struct gl_texture_object *texObj,
* greater than or equal to zero and smaller than the value of
* TEXTURE_VIEW_NUM_LEVELS for texture."
*/
const int max_levels = texObj->Immutable ? texObj->ImmutableLevels :
const int max_levels = texObj->Immutable ? texObj->Attrib.ImmutableLevels :
_mesa_max_texture_levels(ctx, target);
if (level < 0 || level >= max_levels) {

View File

@@ -1458,7 +1458,7 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname,
* just with the purpose of getting the value.
*/
struct gl_texture_object *tex_obj = _mesa_new_texture_object(ctx, 0, target);
buffer[0] = tex_obj->ImageFormatCompatibilityType;
buffer[0] = tex_obj->Attrib.ImageFormatCompatibilityType;
_mesa_delete_texture_object(ctx, tex_obj);
break;

View File

@@ -62,7 +62,7 @@ _mesa_compute_num_levels(struct gl_context *ctx,
numLevels = texObj->Attrib.BaseLevel + baseImage->MaxNumLevels;
numLevels = MIN2(numLevels, (GLuint) texObj->Attrib.MaxLevel + 1);
if (texObj->Immutable)
numLevels = MIN2(numLevels, texObj->NumLevels);
numLevels = MIN2(numLevels, texObj->Attrib.NumLevels);
assert(numLevels >= 1);
return numLevels;

View File

@@ -970,8 +970,13 @@ struct gl_texture_object_attrib
GLenum Swizzle[4]; /**< GL_EXT_texture_swizzle */
GLushort _Swizzle; /**< same as Swizzle, but SWIZZLE_* format */
GLenum16 DepthMode; /**< GL_ARB_depth_texture */
bool StencilSampling; /**< Should we sample stencil instead of depth? */
GLenum16 ImageFormatCompatibilityType; /**< GL_ARB_shader_image_load_store */
GLushort MinLayer; /**< GL_ARB_texture_view */
GLushort NumLayers; /**< GL_ARB_texture_view */
GLboolean GenerateMipmap; /**< GL_SGIS_generate_mipmap */
GLbyte ImmutableLevels; /**< ES 3.0 / ARB_texture_view */
GLubyte MinLevel; /**< GL_ARB_texture_view */
GLubyte NumLevels; /**< GL_ARB_texture_view */
};
/**
@@ -1013,7 +1018,6 @@ struct gl_texture_object
GLbyte _MaxLevel; /**< actual max mipmap level (q in the spec) */
GLfloat _MaxLambda; /**< = _MaxLevel - BaseLevel (q - p in spec) */
GLint CropRect[4]; /**< GL_OES_draw_texture */
GLbyte ImmutableLevels; /**< ES 3.0 / ARB_texture_view */
GLboolean _BaseComplete; /**< Is the base texture level valid? */
GLboolean _MipmapComplete; /**< Is the whole mipmap valid? */
GLboolean _IsIntegerFormat; /**< Does the texture store integer values? */
@@ -1025,24 +1029,20 @@ struct gl_texture_object
GLboolean _IsHalfFloat; /**< GL_OES_half_float_texture */
bool HandleAllocated; /**< GL_ARB_bindless_texture */
/* This should not be restored by glPopAttrib: */
bool StencilSampling; /**< Should we sample stencil instead of depth? */
/** GL_OES_EGL_image_external */
GLubyte RequiredTextureImageUnits;
GLubyte MinLevel; /**< GL_ARB_texture_view */
GLubyte NumLevels; /**< GL_ARB_texture_view */
GLushort MinLayer; /**< GL_ARB_texture_view */
GLushort NumLayers; /**< GL_ARB_texture_view */
/** GL_EXT_memory_object */
GLenum16 TextureTiling;
/** GL_ARB_shader_image_load_store */
GLenum16 ImageFormatCompatibilityType;
/** GL_ARB_texture_buffer_object */
GLenum16 BufferObjectFormat;
/** Equivalent Mesa format for BufferObjectFormat. */
mesa_format _BufferObjectFormat;
/* TODO: BufferObject->Name should be restored by glPopAttrib(GL_TEXTURE_BIT); */
struct gl_buffer_object *BufferObject;
/** GL_ARB_texture_buffer_range */

View File

@@ -495,7 +495,7 @@ _mesa_is_image_unit_valid(struct gl_context *ctx, struct gl_image_unit *u)
if (!tex_format)
return GL_FALSE;
switch (t->ImageFormatCompatibilityType) {
switch (t->Attrib.ImageFormatCompatibilityType) {
case GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE:
if (_mesa_get_format_bytes(tex_format) !=
_mesa_get_format_bytes(u->_ActualFormat))

View File

@@ -352,7 +352,7 @@ _mesa_initialize_texture_object( struct gl_context *ctx,
obj->Sampler.Attrib.CompareMode = GL_NONE; /* ARB_shadow */
obj->Sampler.Attrib.CompareFunc = GL_LEQUAL; /* ARB_shadow */
obj->Attrib.DepthMode = ctx->API == API_OPENGL_CORE ? GL_RED : GL_LUMINANCE;
obj->Attrib.StencilSampling = false;
obj->StencilSampling = false;
obj->Sampler.Attrib.CubeMapSeamless = GL_FALSE;
obj->Sampler.HandleAllocated = GL_FALSE;
obj->Attrib.Swizzle[0] = GL_RED;
@@ -363,7 +363,7 @@ _mesa_initialize_texture_object( struct gl_context *ctx,
obj->Sampler.Attrib.sRGBDecode = GL_DECODE_EXT;
obj->BufferObjectFormat = GL_R8;
obj->_BufferObjectFormat = MESA_FORMAT_R_UNORM8;
obj->ImageFormatCompatibilityType = GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE;
obj->Attrib.ImageFormatCompatibilityType = GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE;
/* GL_ARB_bindless_texture */
_mesa_init_texture_handles(obj);
@@ -710,7 +710,7 @@ _mesa_test_texobj_completeness( const struct gl_context *ctx,
/* Adjust max level for views: the data store may have more levels than
* the view exposes.
*/
t->_MaxLevel = MAX2(MIN2(t->_MaxLevel, t->NumLevels - 1), 0);
t->_MaxLevel = MAX2(MIN2(t->_MaxLevel, t->Attrib.NumLevels - 1), 0);
}
/* Compute _MaxLambda = q - p in the spec used during mipmapping */

View File

@@ -143,7 +143,7 @@ _mesa_is_texture_complete(const struct gl_texture_object *texObj,
*/
if (!isMultisample &&
(texObj->_IsIntegerFormat ||
(texObj->Attrib.StencilSampling &&
(texObj->StencilSampling &&
img->_BaseFormat == GL_DEPTH_STENCIL)) &&
(sampler->Attrib.MagFilter != GL_NEAREST ||
(sampler->Attrib.MinFilter != GL_NEAREST &&

View File

@@ -386,7 +386,7 @@ set_tex_parameteri(struct gl_context *ctx,
/** See note about ARB_texture_storage below */
if (texObj->Immutable)
texObj->Attrib.BaseLevel = MIN2(texObj->ImmutableLevels - 1, params[0]);
texObj->Attrib.BaseLevel = MIN2(texObj->Attrib.ImmutableLevels - 1, params[0]);
else
texObj->Attrib.BaseLevel = params[0];
@@ -413,7 +413,7 @@ set_tex_parameteri(struct gl_context *ctx,
*/
if (texObj->Immutable)
texObj->Attrib.MaxLevel = CLAMP(params[0], texObj->Attrib.BaseLevel,
texObj->ImmutableLevels - 1);
texObj->Attrib.ImmutableLevels - 1);
else
texObj->Attrib.MaxLevel = params[0];
@@ -503,10 +503,10 @@ set_tex_parameteri(struct gl_context *ctx,
if (!stencil && params[0] != GL_DEPTH_COMPONENT)
goto invalid_param;
if (texObj->Attrib.StencilSampling == stencil)
if (texObj->StencilSampling == stencil)
return GL_FALSE;
texObj->Attrib.StencilSampling = stencil;
texObj->StencilSampling = stencil;
return GL_TRUE;
}
goto invalid_pname;
@@ -2246,7 +2246,7 @@ get_tex_parameterfv(struct gl_context *ctx,
if (!_mesa_has_ARB_stencil_texturing(ctx) && !_mesa_is_gles31(ctx))
goto invalid_pname;
*params = (GLfloat)
(obj->Attrib.StencilSampling ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT);
(obj->StencilSampling ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT);
break;
case GL_TEXTURE_LOD_BIAS:
if (_mesa_is_gles(ctx))
@@ -2302,7 +2302,7 @@ get_tex_parameterfv(struct gl_context *ctx,
case GL_TEXTURE_IMMUTABLE_LEVELS:
if (_mesa_is_gles3(ctx) || _mesa_has_texture_view(ctx))
*params = (GLfloat) obj->ImmutableLevels;
*params = (GLfloat) obj->Attrib.ImmutableLevels;
else
goto invalid_pname;
break;
@@ -2310,25 +2310,25 @@ get_tex_parameterfv(struct gl_context *ctx,
case GL_TEXTURE_VIEW_MIN_LEVEL:
if (!_mesa_has_texture_view(ctx))
goto invalid_pname;
*params = (GLfloat) obj->MinLevel;
*params = (GLfloat) obj->Attrib.MinLevel;
break;
case GL_TEXTURE_VIEW_NUM_LEVELS:
if (!_mesa_has_texture_view(ctx))
goto invalid_pname;
*params = (GLfloat) obj->NumLevels;
*params = (GLfloat) obj->Attrib.NumLevels;
break;
case GL_TEXTURE_VIEW_MIN_LAYER:
if (!_mesa_has_texture_view(ctx))
goto invalid_pname;
*params = (GLfloat) obj->MinLayer;
*params = (GLfloat) obj->Attrib.MinLayer;
break;
case GL_TEXTURE_VIEW_NUM_LAYERS:
if (!_mesa_has_texture_view(ctx))
goto invalid_pname;
*params = (GLfloat) obj->NumLayers;
*params = (GLfloat) obj->Attrib.NumLayers;
break;
case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
@@ -2346,7 +2346,7 @@ get_tex_parameterfv(struct gl_context *ctx,
case GL_IMAGE_FORMAT_COMPATIBILITY_TYPE:
if (!ctx->Extensions.ARB_shader_image_load_store)
goto invalid_pname;
*params = (GLfloat) obj->ImageFormatCompatibilityType;
*params = (GLfloat) obj->Attrib.ImageFormatCompatibilityType;
break;
case GL_TEXTURE_TARGET:
@@ -2508,7 +2508,7 @@ get_tex_parameteriv(struct gl_context *ctx,
if (!_mesa_has_ARB_stencil_texturing(ctx) && !_mesa_is_gles31(ctx))
goto invalid_pname;
*params = (GLint)
(obj->Attrib.StencilSampling ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT);
(obj->StencilSampling ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT);
break;
case GL_TEXTURE_LOD_BIAS:
if (_mesa_is_gles(ctx))
@@ -2568,7 +2568,7 @@ get_tex_parameteriv(struct gl_context *ctx,
case GL_TEXTURE_IMMUTABLE_LEVELS:
if (_mesa_is_gles3(ctx) ||
(_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_view))
*params = obj->ImmutableLevels;
*params = obj->Attrib.ImmutableLevels;
else
goto invalid_pname;
break;
@@ -2576,25 +2576,25 @@ get_tex_parameteriv(struct gl_context *ctx,
case GL_TEXTURE_VIEW_MIN_LEVEL:
if (!ctx->Extensions.ARB_texture_view)
goto invalid_pname;
*params = (GLint) obj->MinLevel;
*params = (GLint) obj->Attrib.MinLevel;
break;
case GL_TEXTURE_VIEW_NUM_LEVELS:
if (!ctx->Extensions.ARB_texture_view)
goto invalid_pname;
*params = (GLint) obj->NumLevels;
*params = (GLint) obj->Attrib.NumLevels;
break;
case GL_TEXTURE_VIEW_MIN_LAYER:
if (!ctx->Extensions.ARB_texture_view)
goto invalid_pname;
*params = (GLint) obj->MinLayer;
*params = (GLint) obj->Attrib.MinLayer;
break;
case GL_TEXTURE_VIEW_NUM_LAYERS:
if (!ctx->Extensions.ARB_texture_view)
goto invalid_pname;
*params = (GLint) obj->NumLayers;
*params = (GLint) obj->Attrib.NumLayers;
break;
case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
@@ -2612,7 +2612,7 @@ get_tex_parameteriv(struct gl_context *ctx,
case GL_IMAGE_FORMAT_COMPATIBILITY_TYPE:
if (!ctx->Extensions.ARB_shader_image_load_store)
goto invalid_pname;
*params = obj->ImageFormatCompatibilityType;
*params = obj->Attrib.ImageFormatCompatibilityType;
break;
case GL_TEXTURE_TARGET:

View File

@@ -486,34 +486,34 @@ _mesa_set_texture_view_state(struct gl_context *ctx,
*/
texObj->Immutable = GL_TRUE;
texObj->ImmutableLevels = levels;
texObj->MinLevel = 0;
texObj->NumLevels = levels;
texObj->MinLayer = 0;
texObj->NumLayers = 1;
texObj->Attrib.ImmutableLevels = levels;
texObj->Attrib.MinLevel = 0;
texObj->Attrib.NumLevels = levels;
texObj->Attrib.MinLayer = 0;
texObj->Attrib.NumLayers = 1;
switch (target) {
case GL_TEXTURE_1D_ARRAY:
texObj->NumLayers = texImage->Height;
texObj->Attrib.NumLayers = texImage->Height;
break;
case GL_TEXTURE_2D_MULTISAMPLE:
texObj->NumLevels = 1;
texObj->ImmutableLevels = 1;
texObj->Attrib.NumLevels = 1;
texObj->Attrib.ImmutableLevels = 1;
break;
case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
texObj->NumLevels = 1;
texObj->ImmutableLevels = 1;
texObj->Attrib.NumLevels = 1;
texObj->Attrib.ImmutableLevels = 1;
FALLTHROUGH;
/* fallthrough to set NumLayers */
case GL_TEXTURE_2D_ARRAY:
case GL_TEXTURE_CUBE_MAP_ARRAY:
texObj->NumLayers = texImage->Depth;
texObj->Attrib.NumLayers = texImage->Depth;
break;
case GL_TEXTURE_CUBE_MAP:
texObj->NumLayers = 6;
texObj->Attrib.NumLayers = 6;
break;
}
}
@@ -540,8 +540,8 @@ texture_view(struct gl_context *ctx, struct gl_texture_object *origTexObj,
internalformat, GL_NONE, GL_NONE);
if (texFormat == MESA_FORMAT_NONE) return;
newViewNumLevels = MIN2(numlevels, origTexObj->NumLevels - minlevel);
newViewNumLayers = MIN2(numlayers, origTexObj->NumLayers - minlayer);
newViewNumLevels = MIN2(numlevels, origTexObj->Attrib.NumLevels - minlevel);
newViewNumLayers = MIN2(numlayers, origTexObj->Attrib.NumLayers - minlayer);
faceTarget = _mesa_cube_face_target(origTexObj->Target, minlayer);
@@ -687,12 +687,12 @@ texture_view(struct gl_context *ctx, struct gl_texture_object *origTexObj,
return; /* Already recorded error */
}
texObj->MinLevel = origTexObj->MinLevel + minlevel;
texObj->MinLayer = origTexObj->MinLayer + minlayer;
texObj->NumLevels = newViewNumLevels;
texObj->NumLayers = newViewNumLayers;
texObj->Attrib.MinLevel = origTexObj->Attrib.MinLevel + minlevel;
texObj->Attrib.MinLayer = origTexObj->Attrib.MinLayer + minlayer;
texObj->Attrib.NumLevels = newViewNumLevels;
texObj->Attrib.NumLayers = newViewNumLayers;
texObj->Immutable = GL_TRUE;
texObj->ImmutableLevels = origTexObj->ImmutableLevels;
texObj->Attrib.ImmutableLevels = origTexObj->Attrib.ImmutableLevels;
texObj->Target = target;
texObj->TargetIndex = _mesa_tex_target_to_index(ctx, target);
assert(texObj->TargetIndex < NUM_TEXTURE_TARGETS);
@@ -800,21 +800,25 @@ _mesa_TextureView(GLuint texture, GLenum target, GLuint origtexture,
* If minlevel or minlayer is greater than level or layer, respectively,
* return INVALID_VALUE.
*/
newViewMinLevel = origTexObj->MinLevel + minlevel;
newViewMinLayer = origTexObj->MinLayer + minlayer;
if (newViewMinLevel >= (origTexObj->MinLevel + origTexObj->NumLevels)) {
newViewMinLevel = origTexObj->Attrib.MinLevel + minlevel;
newViewMinLayer = origTexObj->Attrib.MinLayer + minlayer;
if (newViewMinLevel >= (origTexObj->Attrib.MinLevel +
origTexObj->Attrib.NumLevels)) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glTextureView(new minlevel (%d) > orig minlevel (%d)"
" + orig numlevels (%d))",
newViewMinLevel, origTexObj->MinLevel, origTexObj->NumLevels);
newViewMinLevel, origTexObj->Attrib.MinLevel,
origTexObj->Attrib.NumLevels);
return;
}
if (newViewMinLayer >= (origTexObj->MinLayer + origTexObj->NumLayers)) {
if (newViewMinLayer >= (origTexObj->Attrib.MinLayer +
origTexObj->Attrib.NumLayers)) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glTextureView(new minlayer (%d) > orig minlayer (%d)"
" + orig numlayers (%d))",
newViewMinLayer, origTexObj->MinLayer, origTexObj->NumLayers);
newViewMinLayer, origTexObj->Attrib.MinLayer,
origTexObj->Attrib.NumLayers);
return;
}

View File

@@ -113,7 +113,7 @@ st_convert_image(const struct st_context *st, const struct gl_image_unit *u,
}
img->resource = stObj->pt;
img->u.tex.level = u->Level + stObj->base.MinLevel;
img->u.tex.level = u->Level + stObj->base.Attrib.MinLevel;
assert(img->u.tex.level <= img->resource->last_level);
if (stObj->pt->target == PIPE_TEXTURE_3D) {
if (u->Layered) {
@@ -124,11 +124,11 @@ st_convert_image(const struct st_context *st, const struct gl_image_unit *u,
img->u.tex.last_layer = u->_Layer;
}
} else {
img->u.tex.first_layer = u->_Layer + stObj->base.MinLayer;
img->u.tex.last_layer = u->_Layer + stObj->base.MinLayer;
img->u.tex.first_layer = u->_Layer + stObj->base.Attrib.MinLayer;
img->u.tex.last_layer = u->_Layer + stObj->base.Attrib.MinLayer;
if (u->Layered && img->resource->array_size > 1) {
if (stObj->base.Immutable)
img->u.tex.last_layer += stObj->base.NumLayers - 1;
img->u.tex.last_layer += stObj->base.Attrib.NumLayers - 1;
else
img->u.tex.last_layer += img->resource->array_size - 1;
}

View File

@@ -168,7 +168,7 @@ st_convert_sampler(const struct st_context *st,
const GLboolean is_integer = texobj->_IsIntegerFormat;
GLenum texBaseFormat = _mesa_base_tex_image(texobj)->_BaseFormat;
if (texobj->Attrib.StencilSampling)
if (texobj->StencilSampling)
texBaseFormat = GL_STENCIL_INDEX;
if (st->apply_texture_swizzle_to_border_color) {
@@ -212,7 +212,7 @@ st_convert_sampler(const struct st_context *st,
GLenum texBaseFormat = _mesa_base_tex_image(texobj)->_BaseFormat;
if (texBaseFormat == GL_DEPTH_COMPONENT ||
(texBaseFormat == GL_DEPTH_STENCIL && !texobj->Attrib.StencilSampling)) {
(texBaseFormat == GL_DEPTH_STENCIL && !texobj->StencilSampling)) {
sampler->compare_mode = PIPE_TEX_COMPARE_R_TO_TEXTURE;
sampler->compare_func = st_compare_func_to_pipe(msamp->Attrib.CompareFunc);
}

View File

@@ -650,8 +650,8 @@ st_CopyImageSubData(struct gl_context *ctx,
src_level = stObj->pt != src_res ? 0 : src_image->Level;
src_z += src_image->Face;
if (src_image->TexObject->Immutable) {
src_level += src_image->TexObject->MinLevel;
src_z += src_image->TexObject->MinLayer;
src_level += src_image->TexObject->Attrib.MinLevel;
src_z += src_image->TexObject->Attrib.MinLayer;
}
} else {
struct st_renderbuffer *src = st_renderbuffer(src_renderbuffer);
@@ -666,8 +666,8 @@ st_CopyImageSubData(struct gl_context *ctx,
dst_level = stObj->pt != dst_res ? 0 : dst_image->Level;
dst_z += dst_image->Face;
if (dst_image->TexObject->Immutable) {
dst_level += dst_image->TexObject->MinLevel;
dst_z += dst_image->TexObject->MinLayer;
dst_level += dst_image->TexObject->Attrib.MinLevel;
dst_z += dst_image->TexObject->Attrib.MinLayer;
}
} else {
struct st_renderbuffer *dst = st_renderbuffer(dst_renderbuffer);

View File

@@ -513,11 +513,12 @@ st_update_renderbuffer_surface(struct st_context *st,
if (strb->is_rtt && resource->array_size > 1 &&
stTexObj->base.Immutable) {
const struct gl_texture_object *tex = &stTexObj->base;
first_layer += tex->MinLayer;
first_layer += tex->Attrib.MinLayer;
if (!strb->rtt_layered)
last_layer += tex->MinLayer;
last_layer += tex->Attrib.MinLayer;
else
last_layer = MIN2(first_layer + tex->NumLayers - 1, last_layer);
last_layer = MIN2(first_layer + tex->Attrib.NumLayers - 1,
last_layer);
}
struct pipe_surface **psurf =

View File

@@ -1459,10 +1459,10 @@ try_pbo_upload(struct gl_context *ctx, GLuint dims,
/* Set up the surface */
{
unsigned level = stObj->pt != stImage->pt
? 0 : texImage->TexObject->MinLevel + texImage->Level;
? 0 : texImage->TexObject->Attrib.MinLevel + texImage->Level;
unsigned max_layer = util_max_layer(texture, level);
zoffset += texImage->Face + texImage->TexObject->MinLayer;
zoffset += texImage->Face + texImage->TexObject->Attrib.MinLayer;
struct pipe_surface templ;
memset(&templ, 0, sizeof(templ));
@@ -1507,7 +1507,7 @@ st_TexSubImage(struct gl_context *ctx, GLuint dims,
GLenum gl_target = texImage->TexObject->Target;
unsigned bind;
GLubyte *map;
unsigned dstz = texImage->Face + texImage->TexObject->MinLayer;
unsigned dstz = texImage->Face + texImage->TexObject->Attrib.MinLayer;
unsigned dst_level = 0;
bool throttled = false;
@@ -1515,7 +1515,7 @@ st_TexSubImage(struct gl_context *ctx, GLuint dims,
st_invalidate_readpix_cache(st);
if (stObj->pt == stImage->pt)
dst_level = texImage->TexObject->MinLevel + texImage->Level;
dst_level = texImage->TexObject->Attrib.MinLevel + texImage->Level;
assert(!_mesa_is_format_etc2(texImage->TexFormat) &&
!_mesa_is_format_astc_2d(texImage->TexFormat) &&
@@ -1889,10 +1889,10 @@ st_CompressedTexSubImage(struct gl_context *ctx, GLuint dims,
/* Set up the surface. */
{
unsigned level = stObj->pt != stImage->pt
? 0 : texImage->TexObject->MinLevel + texImage->Level;
? 0 : texImage->TexObject->Attrib.MinLevel + texImage->Level;
unsigned max_layer = util_max_layer(texture, level);
GLint layer = z + texImage->Face + texImage->TexObject->MinLayer;
GLint layer = z + texImage->Face + texImage->TexObject->Attrib.MinLayer;
struct pipe_surface templ;
memset(&templ, 0, sizeof(templ));
@@ -2188,12 +2188,12 @@ st_GetTexSubImage(struct gl_context * ctx,
}
assert(texImage->Face == 0 ||
texImage->TexObject->MinLayer == 0 ||
texImage->TexObject->Attrib.MinLayer == 0 ||
zoffset == 0);
memset(&blit, 0, sizeof(blit));
blit.src.resource = src;
blit.src.level = texImage->Level + texImage->TexObject->MinLevel;
blit.src.level = texImage->Level + texImage->TexObject->Attrib.MinLevel;
blit.src.format = src_format;
blit.dst.resource = dst;
blit.dst.level = 0;
@@ -2202,7 +2202,7 @@ st_GetTexSubImage(struct gl_context * ctx,
blit.dst.box.x = 0;
blit.src.box.y = yoffset;
blit.dst.box.y = 0;
blit.src.box.z = texImage->Face + texImage->TexObject->MinLayer + zoffset;
blit.src.box.z = texImage->Face + texImage->TexObject->Attrib.MinLayer + zoffset;
blit.dst.box.z = 0;
blit.src.box.width = blit.dst.box.width = width;
blit.src.box.height = blit.dst.box.height = height;
@@ -2592,10 +2592,11 @@ st_CopyTexSubImage(struct gl_context *ctx, GLuint dims,
blit.dst.resource = stImage->pt;
blit.dst.format = dst_format;
blit.dst.level = stObj->pt != stImage->pt
? 0 : texImage->Level + texImage->TexObject->MinLevel;
? 0 : texImage->Level + texImage->TexObject->Attrib.MinLevel;
blit.dst.box.x = destX;
blit.dst.box.y = destY;
blit.dst.box.z = stImage->base.Face + slice + texImage->TexObject->MinLayer;
blit.dst.box.z = stImage->base.Face + slice +
texImage->TexObject->Attrib.MinLayer;
blit.dst.box.width = width;
blit.dst.box.height = height;
blit.dst.box.depth = 1;
@@ -3134,7 +3135,7 @@ st_TextureView(struct gl_context *ctx,
struct gl_texture_image *image = texObj->Image[0][0];
const int numFaces = _mesa_num_tex_faces(texObj->Target);
const int numLevels = texObj->NumLevels;
const int numLevels = texObj->Attrib.NumLevels;
int face;
int level;
@@ -3244,8 +3245,8 @@ st_ClearTexSubImage(struct gl_context *ctx,
* not a texture view, the offsets will be zero.
*/
assert(stImage->pt == st_texture_object(texObj)->pt);
level = texImage->Level + texObj->MinLevel;
box.z += texObj->MinLayer;
level = texImage->Level + texObj->Attrib.MinLevel;
box.z += texObj->Attrib.MinLayer;
}
else {
/* Texture level sizes may be inconsistent. We my have "loose",

View File

@@ -64,7 +64,7 @@ st_generate_mipmap(struct gl_context *ctx, GLenum target,
return;
if (texObj->Immutable)
baseLevel += texObj->MinLevel;
baseLevel += texObj->Attrib.MinLevel;
/* not sure if this ultimately actually should work,
but we're not supporting multisampled textures yet. */
@@ -74,7 +74,7 @@ st_generate_mipmap(struct gl_context *ctx, GLenum target,
lastLevel = _mesa_compute_num_levels(ctx, texObj, target) - 1;
if (texObj->Immutable)
lastLevel += texObj->MinLevel;
lastLevel += texObj->Attrib.MinLevel;
if (lastLevel == 0)
return;

View File

@@ -445,10 +445,11 @@ check_sampler_swizzle(const struct st_context *st,
static unsigned
last_level(const struct st_texture_object *stObj)
{
unsigned ret = MIN2(stObj->base.MinLevel + stObj->base._MaxLevel,
unsigned ret = MIN2(stObj->base.Attrib.MinLevel + stObj->base._MaxLevel,
stObj->pt->last_level);
if (stObj->base.Immutable)
ret = MIN2(ret, stObj->base.MinLevel + stObj->base.NumLevels - 1);
ret = MIN2(ret, stObj->base.Attrib.MinLevel +
stObj->base.Attrib.NumLevels - 1);
return ret;
}
@@ -457,7 +458,8 @@ static unsigned
last_layer(const struct st_texture_object *stObj)
{
if (stObj->base.Immutable && stObj->pt->array_size > 1)
return MIN2(stObj->base.MinLayer + stObj->base.NumLayers - 1,
return MIN2(stObj->base.Attrib.MinLayer +
stObj->base.Attrib.NumLayers - 1,
stObj->pt->array_size - 1);
return stObj->pt->array_size - 1;
}
@@ -479,7 +481,7 @@ get_sampler_view_format(struct st_context *st,
if (baseFormat == GL_DEPTH_COMPONENT ||
baseFormat == GL_DEPTH_STENCIL ||
baseFormat == GL_STENCIL_INDEX) {
if (stObj->base.Attrib.StencilSampling || baseFormat == GL_STENCIL_INDEX)
if (stObj->base.StencilSampling || baseFormat == GL_STENCIL_INDEX)
format = util_format_stencil_only(format);
return format;
@@ -541,13 +543,14 @@ st_create_texture_sampler_view_from_stobj(struct st_context *st,
if (stObj->level_override >= 0) {
templ.u.tex.first_level = templ.u.tex.last_level = stObj->level_override;
} else {
templ.u.tex.first_level = stObj->base.MinLevel + stObj->base.Attrib.BaseLevel;
templ.u.tex.first_level = stObj->base.Attrib.MinLevel +
stObj->base.Attrib.BaseLevel;
templ.u.tex.last_level = last_level(stObj);
}
if (stObj->layer_override >= 0) {
templ.u.tex.first_layer = templ.u.tex.last_layer = stObj->layer_override;
} else {
templ.u.tex.first_layer = stObj->base.MinLayer;
templ.u.tex.first_layer = stObj->base.Attrib.MinLayer;
templ.u.tex.last_layer = last_layer(stObj);
}
assert(templ.u.tex.first_layer <= templ.u.tex.last_layer);
@@ -590,9 +593,11 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st,
assert(get_sampler_view_format(st, stObj, srgb_skip_decode) == view->format);
assert(gl_target_to_pipe(stObj->base.Target) == view->target);
assert(stObj->level_override >= 0 ||
stObj->base.MinLevel + stObj->base.Attrib.BaseLevel == view->u.tex.first_level);
stObj->base.Attrib.MinLevel +
stObj->base.Attrib.BaseLevel == view->u.tex.first_level);
assert(stObj->level_override >= 0 || last_level(stObj) == view->u.tex.last_level);
assert(stObj->layer_override >= 0 || stObj->base.MinLayer == view->u.tex.first_layer);
assert(stObj->layer_override >= 0 ||
stObj->base.Attrib.MinLayer == view->u.tex.first_layer);
assert(stObj->layer_override >= 0 || last_layer(stObj) == view->u.tex.last_layer);
assert(stObj->layer_override < 0 ||
(stObj->layer_override == view->u.tex.first_layer &&

View File

@@ -268,10 +268,10 @@ st_texture_image_map(struct st_context *st, struct st_texture_image *stImage,
level = stImage->base.Level;
if (stObj->base.Immutable) {
level += stObj->base.MinLevel;
z += stObj->base.MinLayer;
level += stObj->base.Attrib.MinLevel;
z += stObj->base.Attrib.MinLayer;
if (stObj->pt->array_size > 1)
d = MIN2(d, stObj->base.NumLayers);
d = MIN2(d, stObj->base.Attrib.NumLayers);
}
z += stImage->base.Face;
@@ -308,7 +308,7 @@ st_texture_image_unmap(struct st_context *st,
struct pipe_transfer **transfer;
if (stObj->base.Immutable)
slice += stObj->base.MinLayer;
slice += stObj->base.Attrib.MinLayer;
transfer = &stImage->transfer[slice + stImage->base.Face].transfer;
DBG("%s\n", __func__);