/** * ctx->Driver.AllocTextureStorage() handler. * * Compare this to _mesa_alloc_texture_storage, which would call into * intel_alloc_texture_image_buffer() above. */ static GLboolean intel_alloc_texture_storage(struct gl_context *ctx, struct gl_texture_object *texobj, GLsizei levels, GLsizei width, GLsizei height, GLsizei depth) { struct brw_context *brw = brw_context(ctx); struct intel_texture_object *intel_texobj = intel_texture_object(texobj); struct gl_texture_image *first_image = texobj->Image[0][0]; int num_samples = intel_quantize_num_samples(brw->intelScreen, first_image->NumSamples); const int numFaces = _mesa_num_tex_faces(texobj->Target); int face; int level; /* If the object's current miptree doesn't match what we need, make a new * one. */ if (!intel_texobj->mt || !intel_miptree_match_image(intel_texobj->mt, first_image) || intel_texobj->mt->last_level != levels - 1) { intel_miptree_release(&intel_texobj->mt); intel_texobj->mt = intel_miptree_create(brw, texobj->Target, first_image->TexFormat, 0, levels - 1, width, height, depth, false, /* expect_accelerated */ num_samples, INTEL_MIPTREE_TILING_ANY, false); if (intel_texobj->mt == NULL) { return false; } } for (face = 0; face < numFaces; face++) { for (level = 0; level < levels; level++) { struct gl_texture_image *image = texobj->Image[face][level]; struct intel_texture_image *intel_image = intel_texture_image(image); image->NumSamples = num_samples; _swrast_free_texture_image_buffer(ctx, image); if (!_swrast_init_texture_image(image)) return false; intel_miptree_reference(&intel_image->mt, intel_texobj->mt); } } /* The miptree is in a validated state, so no need to check later. */ intel_texobj->needs_validate = false; intel_texobj->validated_first_level = 0; intel_texobj->validated_last_level = levels - 1; intel_texobj->_Format = intel_texobj->mt->format; return true; }
static void intel_free_texture_image_buffer(struct gl_context * ctx, struct gl_texture_image *texImage) { struct intel_texture_image *intelImage = intel_texture_image(texImage); DBG("%s\n", __FUNCTION__); intel_miptree_release(&intelImage->mt); _swrast_free_texture_image_buffer(ctx, texImage); }
/** * Free memory associated with this texture image. */ void radeonFreeTextureImageBuffer(struct gl_context *ctx, struct gl_texture_image *timage) { radeon_texture_image* image = get_radeon_texture_image(timage); if (image->mt) { radeon_miptree_unreference(&image->mt); } else { _swrast_free_texture_image_buffer(ctx, timage); } if (image->bo) { radeon_bo_unref(image->bo); image->bo = NULL; } if (image->base.Buffer) { _mesa_align_free(image->base.Buffer); image->base.Buffer = NULL; } free(image->base.ImageOffsets); image->base.ImageOffsets = NULL; }