1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/swrast.h"
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/renderbuffer.h"
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/texobj.h"
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/teximage.h"
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mipmap.h"
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "drivers/common/meta.h"
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_context.h"
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_mipmap_tree.h"
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_tex.h"
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FILE_DEBUG_FLAG DEBUG_TEXTURE
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct gl_texture_image *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintelNewTextureImage(struct gl_context * ctx)
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DBG("%s\n", __FUNCTION__);
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) ctx;
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (struct gl_texture_image *) CALLOC_STRUCT(intel_texture_image);
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintelDeleteTextureImage(struct gl_context * ctx, struct gl_texture_image *img)
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* nothing special (yet) for intel_texture_image */
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_delete_texture_image(ctx, img);
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct gl_texture_object *
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintelNewTextureObject(struct gl_context * ctx, GLuint name, GLenum target)
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_texture_object *obj = CALLOC_STRUCT(intel_texture_object);
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) ctx;
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DBG("%s\n", __FUNCTION__);
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_initialize_texture_object(&obj->base, name, target);
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &obj->base;
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintelDeleteTextureObject(struct gl_context *ctx,
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 struct gl_texture_object *texObj)
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_texture_object *intelObj = intel_texture_object(texObj);
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_release(&intelObj->mt);
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_delete_texture_object(ctx, texObj);
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_alloc_texture_image_buffer(struct gl_context *ctx,
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 struct gl_texture_image *image)
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = intel_context(ctx);
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_texture_image *intel_image = intel_texture_image(image);
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_object *texobj = image->TexObject;
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_texture_object *intel_texobj = intel_texture_object(texobj);
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint slices;
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(image->Border == 0);
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Because the driver uses AllocTextureImageBuffer() internally, it may end
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * up mismatched with FreeTextureImageBuffer(), but that is safe to call
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * multiple times.
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Driver.FreeTextureImageBuffer(ctx, image);
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Allocate the swrast_texture_image::ImageOffsets array now */
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (texobj->Target) {
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_3D:
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D_ARRAY:
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      slices = image->Depth;
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D_ARRAY:
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      slices = image->Height;
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      slices = 1;
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(!intel_image->base.ImageOffsets);
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_image->base.ImageOffsets = malloc(slices * sizeof(GLuint));
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _swrast_init_texture_image(image);
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intel_texobj->mt &&
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       intel_miptree_match_image(intel_texobj->mt, image)) {
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_reference(&intel_image->mt, intel_texobj->mt);
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DBG("%s: alloc obj %p level %d %dx%dx%d using object's miptree %p\n",
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          __FUNCTION__, texobj, image->Level,
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          image->Width, image->Height, image->Depth, intel_texobj->mt);
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_image->mt = intel_miptree_create_for_teximage(intel, intel_texobj,
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                          intel_image,
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                          false);
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Even if the object currently has a mipmap tree associated
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * with it, this one is a more likely candidate to represent the
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * whole object since our level didn't fit what was there
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * before, and any lower levels would fit into our miptree.
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_reference(&intel_texobj->mt, intel_image->mt);
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DBG("%s: alloc obj %p level %d %dx%dx%d using new miptree %p\n",
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          __FUNCTION__, texobj, image->Level,
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          image->Width, image->Height, image->Depth, intel_image->mt);
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return true;
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via ctx->Driver.AllocTextureStorage()
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Just have to allocate memory for the texture images.
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_alloc_texture_storage(struct gl_context *ctx,
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            struct gl_texture_object *texObj,
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            GLsizei levels, GLsizei width,
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            GLsizei height, GLsizei depth)
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int numFaces = _mesa_num_tex_faces(texObj->Target);
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int face;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int level;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (face = 0; face < numFaces; face++) {
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (level = 0; level < levels; level++) {
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         struct gl_texture_image *const texImage = texObj->Image[face][level];
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!intel_alloc_texture_image_buffer(ctx, texImage))
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return false;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return true;
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_free_texture_image_buffer(struct gl_context * ctx,
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				struct gl_texture_image *texImage)
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_texture_image *intelImage = intel_texture_image(texImage);
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DBG("%s\n", __FUNCTION__);
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_release(&intelImage->mt);
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intelImage->base.Buffer) {
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_align_free(intelImage->base.Buffer);
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intelImage->base.Buffer = NULL;
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intelImage->base.ImageOffsets) {
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(intelImage->base.ImageOffsets);
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intelImage->base.ImageOffsets = NULL;
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Map texture memory/buffer into user space.
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: the region of interest parameters are ignored here.
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param mode  bitmask of GL_MAP_READ_BIT, GL_MAP_WRITE_BIT
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param mapOut  returns start of mapping of region of interest
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param rowStrideOut  returns row stride in bytes
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_map_texture_image(struct gl_context *ctx,
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			struct gl_texture_image *tex_image,
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLuint slice,
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLuint x, GLuint y, GLuint w, GLuint h,
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLbitfield mode,
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLubyte **map,
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			GLint *stride)
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = intel_context(ctx);
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_texture_image *intel_image = intel_texture_image(tex_image);
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_mipmap_tree *mt = intel_image->mt;
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Our texture data is always stored in a miptree. */
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(mt);
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Check that our caller wasn't confused about how to map a 1D texture. */
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(tex_image->TexObject->Target != GL_TEXTURE_1D_ARRAY ||
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  h == 1);
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* intel_miptree_map operates on a unified "slice" number that references the
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * cube face, since it's all just slices to the miptree code.
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (tex_image->TexObject->Target == GL_TEXTURE_CUBE_MAP)
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      slice = tex_image->Face;
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_map(intel, mt, tex_image->Level, slice, x, y, w, h, mode,
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     (void **)map, stride);
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_unmap_texture_image(struct gl_context *ctx,
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  struct gl_texture_image *tex_image, GLuint slice)
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = intel_context(ctx);
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_texture_image *intel_image = intel_texture_image(tex_image);
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_mipmap_tree *mt = intel_image->mt;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (tex_image->TexObject->Target == GL_TEXTURE_CUBE_MAP)
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      slice = tex_image->Face;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_unmap(intel, mt, tex_image->Level, slice);
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintelInitTextureFuncs(struct dd_function_table *functions)
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->NewTextureObject = intelNewTextureObject;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->NewTextureImage = intelNewTextureImage;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->DeleteTextureImage = intelDeleteTextureImage;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->DeleteTexture = intelDeleteTextureObject;
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->AllocTextureImageBuffer = intel_alloc_texture_image_buffer;
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->FreeTextureImageBuffer = intel_free_texture_image_buffer;
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->AllocTextureStorage = intel_alloc_texture_storage;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->MapTextureImage = intel_map_texture_image;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->UnmapTextureImage = intel_unmap_texture_image;
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
223