intel: make intel_texture_image a subclass of swrast_texture_image
authorBrian Paul <brianp@vmware.com>
Sat, 17 Sep 2011 20:50:48 +0000 (14:50 -0600)
committerBrian Paul <brianp@vmware.com>
Sat, 17 Sep 2011 20:57:40 +0000 (14:57 -0600)
We need to subclass swrast_texture_image because if we use swrast for
fallback rendering, we'll need to have swrast_texture_image objects.

src/mesa/drivers/dri/intel/intel_blit.c
src/mesa/drivers/dri/intel/intel_fbo.c
src/mesa/drivers/dri/intel/intel_mipmap_tree.c
src/mesa/drivers/dri/intel/intel_tex_copy.c
src/mesa/drivers/dri/intel/intel_tex_image.c
src/mesa/drivers/dri/intel/intel_tex_obj.h
src/mesa/drivers/dri/intel/intel_tex_subimage.c
src/mesa/drivers/dri/intel/intel_tex_validate.c

index 45cfb62014ef7ac8fa2a22e591bb641a8bb89be2..5a866489b0b1dd54b40123c808b9420078158e9e 100644 (file)
@@ -534,19 +534,19 @@ intel_set_teximage_alpha_to_one(struct gl_context *ctx,
    struct intel_region *region = intel_image->mt->region;
    BATCH_LOCALS;
 
-   assert(intel_image->base.TexFormat == MESA_FORMAT_ARGB8888);
+   assert(intel_image->base.Base.TexFormat == MESA_FORMAT_ARGB8888);
 
    /* get dest x/y in destination texture */
    intel_miptree_get_image_offset(intel_image->mt,
-                                 intel_image->base.Level,
-                                 intel_image->base.Face,
+                                 intel_image->base.Base.Level,
+                                 intel_image->base.Base.Face,
                                  0,
                                  &image_x, &image_y);
 
    x1 = image_x;
    y1 = image_y;
-   x2 = image_x + intel_image->base.Width;
-   y2 = image_y + intel_image->base.Height;
+   x2 = image_x + intel_image->base.Base.Width;
+   y2 = image_y + intel_image->base.Base.Height;
 
    pitch = region->pitch;
    cpp = region->cpp;
index 6c55fdc61c0d45bf8c8f93869e9320fbbc728603..418e426e42b6b002daad1386c1ad864b98591518 100644 (file)
@@ -611,8 +611,8 @@ intel_renderbuffer_set_draw_offset(struct intel_renderbuffer *irb,
 
    /* compute offset of the particular 2D image within the texture region */
    intel_miptree_get_image_offset(intel_image->mt,
-                                 intel_image->base.Level,
-                                 intel_image->base.Face,
+                                 intel_image->base.Base.Level,
+                                 intel_image->base.Base.Face,
                                  zoffset,
                                  &dst_x, &dst_y);
 
@@ -738,18 +738,18 @@ intel_render_texture(struct gl_context * ctx,
       struct intel_mipmap_tree *new_mt;
 
       new_mt = intel_miptree_create(intel, image->TexObject->Target,
-                                   intel_image->base.TexFormat,
-                                   intel_image->base.Level,
-                                   intel_image->base.Level,
-                                   intel_image->base.Width,
-                                   intel_image->base.Height,
-                                   intel_image->base.Depth,
+                                   intel_image->base.Base.TexFormat,
+                                   intel_image->base.Base.Level,
+                                   intel_image->base.Base.Level,
+                                   intel_image->base.Base.Width,
+                                   intel_image->base.Base.Height,
+                                   intel_image->base.Base.Depth,
                                    GL_TRUE);
 
       intel_miptree_image_copy(intel,
                                new_mt,
-                              intel_image->base.Face,
-                              intel_image->base.Level,
+                              intel_image->base.Base.Face,
+                              intel_image->base.Base.Level,
                               old_mt);
 
       intel_miptree_release(intel, &intel_image->mt);
index 7739fa4183fa98cb0ff1ec0b8b6a7add5b0be83c..b77c5d708f1b34a079b81ef7c2a99368c12dd406 100644 (file)
@@ -224,7 +224,7 @@ intel_miptree_match_image(struct intel_mipmap_tree *mt,
                           struct gl_texture_image *image)
 {
    struct intel_texture_image *intelImage = intel_texture_image(image);
-   GLuint level = intelImage->base.Level;
+   GLuint level = intelImage->base.Base.Level;
 
    /* Images with borders are never pulled into mipmap trees. */
    if (image->Border)
index a2ae2db165f45f49bc4024a7f35bcade7a42f854..326f62f75672a8a01b8ef6c4d89e0757f8e2946c 100644 (file)
@@ -71,7 +71,7 @@ intel_copy_texsubimage(struct intel_context *intel,
 {
    struct gl_context *ctx = &intel->ctx;
    struct intel_renderbuffer *irb;
-   const GLenum internalFormat = intelImage->base.InternalFormat;
+   const GLenum internalFormat = intelImage->base.Base.InternalFormat;
    bool copy_supported = false;
    bool copy_supported_with_alpha_override = false;
 
@@ -85,17 +85,17 @@ intel_copy_texsubimage(struct intel_context *intel,
       return GL_FALSE;
    }
 
-   copy_supported = intelImage->base.TexFormat == irb->Base.Format;
+   copy_supported = intelImage->base.Base.TexFormat == irb->Base.Format;
 
    /* Converting ARGB8888 to XRGB8888 is trivial: ignore the alpha bits */
    if (irb->Base.Format == MESA_FORMAT_ARGB8888 &&
-       intelImage->base.TexFormat == MESA_FORMAT_XRGB8888) {
+       intelImage->base.Base.TexFormat == MESA_FORMAT_XRGB8888) {
       copy_supported = true;
    }
 
    /* Converting XRGB8888 to ARGB8888 requires setting the alpha bits to 1.0 */
    if (irb->Base.Format == MESA_FORMAT_XRGB8888 &&
-       intelImage->base.TexFormat == MESA_FORMAT_ARGB8888) {
+       intelImage->base.Base.TexFormat == MESA_FORMAT_ARGB8888) {
       copy_supported_with_alpha_override = true;
    }
 
@@ -103,7 +103,7 @@ intel_copy_texsubimage(struct intel_context *intel,
       if (unlikely(INTEL_DEBUG & DEBUG_FALLBACKS))
         fprintf(stderr, "%s mismatched formats %s, %s\n",
                 __FUNCTION__,
-                _mesa_get_format_name(intelImage->base.TexFormat),
+                _mesa_get_format_name(intelImage->base.Base.TexFormat),
                 _mesa_get_format_name(irb->Base.Format));
       return GL_FALSE;
    }
@@ -117,8 +117,8 @@ intel_copy_texsubimage(struct intel_context *intel,
 
       /* get dest x/y in destination texture */
       intel_miptree_get_image_offset(intelImage->mt,
-                                    intelImage->base.Level,
-                                    intelImage->base.Face,
+                                    intelImage->base.Base.Level,
+                                    intelImage->base.Base.Face,
                                     0,
                                     &image_x, &image_y);
 
index 2ef5d5562af66cf470b2b104f427156d35294295..fd719e430480966ba10fc4e7db7ddd16699671e5 100644 (file)
@@ -53,40 +53,40 @@ intel_miptree_create_for_teximage(struct intel_context *intel,
 {
    GLuint firstLevel;
    GLuint lastLevel;
-   GLuint width = intelImage->base.Width;
-   GLuint height = intelImage->base.Height;
-   GLuint depth = intelImage->base.Depth;
+   GLuint width = intelImage->base.Base.Width;
+   GLuint height = intelImage->base.Base.Height;
+   GLuint depth = intelImage->base.Base.Depth;
    GLuint i;
 
    DBG("%s\n", __FUNCTION__);
 
-   if (intelImage->base.Border)
+   if (intelImage->base.Base.Border)
       return NULL;
 
-   if (intelImage->base.Level > intelObj->base.BaseLevel &&
-       (intelImage->base.Width == 1 ||
+   if (intelImage->base.Base.Level > intelObj->base.BaseLevel &&
+       (intelImage->base.Base.Width == 1 ||
         (intelObj->base.Target != GL_TEXTURE_1D &&
-         intelImage->base.Height == 1) ||
+         intelImage->base.Base.Height == 1) ||
         (intelObj->base.Target == GL_TEXTURE_3D &&
-         intelImage->base.Depth == 1))) {
+         intelImage->base.Base.Depth == 1))) {
       /* For this combination, we're at some lower mipmap level and
        * some important dimension is 1.  We can't extrapolate up to a
        * likely base level width/height/depth for a full mipmap stack
        * from this info, so just allocate this one level.
        */
-      firstLevel = intelImage->base.Level;
-      lastLevel = intelImage->base.Level;
+      firstLevel = intelImage->base.Base.Level;
+      lastLevel = intelImage->base.Base.Level;
    } else {
       /* If this image disrespects BaseLevel, allocate from level zero.
        * Usually BaseLevel == 0, so it's unlikely to happen.
        */
-      if (intelImage->base.Level < intelObj->base.BaseLevel)
+      if (intelImage->base.Base.Level < intelObj->base.BaseLevel)
         firstLevel = 0;
       else
         firstLevel = intelObj->base.BaseLevel;
 
       /* Figure out image dimensions at start level. */
-      for (i = intelImage->base.Level; i > firstLevel; i--) {
+      for (i = intelImage->base.Base.Level; i > firstLevel; i--) {
         width <<= 1;
         if (height != 1)
            height <<= 1;
@@ -101,7 +101,7 @@ intel_miptree_create_for_teximage(struct intel_context *intel,
        */
       if ((intelObj->base.Sampler.MinFilter == GL_NEAREST ||
           intelObj->base.Sampler.MinFilter == GL_LINEAR) &&
-         intelImage->base.Level == firstLevel &&
+         intelImage->base.Base.Level == firstLevel &&
          (intel->gen < 4 || firstLevel == 0)) {
         lastLevel = firstLevel;
       } else {
@@ -111,7 +111,7 @@ intel_miptree_create_for_teximage(struct intel_context *intel,
 
    return intel_miptree_create(intel,
                               intelObj->base.Target,
-                              intelImage->base.TexFormat,
+                              intelImage->base.Base.TexFormat,
                               firstLevel,
                               lastLevel,
                               width,
@@ -184,8 +184,8 @@ try_pbo_upload(struct intel_context *intel,
    else
       src_stride = width;
 
-   intel_miptree_get_image_offset(intelImage->mt, intelImage->base.Level,
-                                 intelImage->base.Face, 0,
+   intel_miptree_get_image_offset(intelImage->mt, intelImage->base.Base.Level,
+                                 intelImage->base.Base.Face, 0,
                                  &dst_x, &dst_y);
 
    dst_stride = intelImage->mt->region->pitch;
@@ -239,8 +239,8 @@ try_pbo_zcopy(struct intel_context *intel,
    else
       src_stride = width;
 
-   intel_miptree_get_image_offset(intelImage->mt, intelImage->base.Level,
-                                 intelImage->base.Face, 0,
+   intel_miptree_get_image_offset(intelImage->mt, intelImage->base.Base.Level,
+                                 intelImage->base.Base.Face, 0,
                                  &dst_x, &dst_y);
 
    dst_stride = intelImage->mt->region->pitch;
@@ -271,8 +271,8 @@ intel_tex_image_s8z24_scattergather(struct intel_context *intel,
    struct gl_renderbuffer *depth_rb = intel_image->depth_rb;
    struct gl_renderbuffer *stencil_rb = intel_image->stencil_rb;
 
-   int w = intel_image->base.Width;
-   int h = intel_image->base.Height;
+   int w = intel_image->base.Base.Width;
+   int h = intel_image->base.Base.Height;
 
    uint32_t depth_row[w];
    uint8_t stencil_row[w];
@@ -333,15 +333,15 @@ intel_tex_image_s8z24_create_renderbuffers(struct intel_context *intel,
    struct gl_context *ctx = &intel->ctx;
 
    bool ok = true;
-   int width = image->base.Width;
-   int height = image->base.Height;
+   int width = image->base.Base.Width;
+   int height = image->base.Base.Height;
    struct gl_renderbuffer *drb;
    struct gl_renderbuffer *srb;
    struct intel_renderbuffer *idrb;
    struct intel_renderbuffer *isrb;
 
    assert(intel->has_separate_stencil);
-   assert(image->base.TexFormat == MESA_FORMAT_S8_Z24);
+   assert(image->base.Base.TexFormat == MESA_FORMAT_S8_Z24);
    assert(image->mt != NULL);
 
    drb = intel_create_wrapped_renderbuffer(ctx, width, height,
@@ -418,11 +418,11 @@ intelTexImage(struct gl_context * ctx,
    assert(!intelImage->mt);
 
    if (intelObj->mt &&
-       intel_miptree_match_image(intelObj->mt, &intelImage->base)) {
+       intel_miptree_match_image(intelObj->mt, &intelImage->base.Base)) {
       /* Use an existing miptree when possible */
       intel_miptree_reference(&intelImage->mt, intelObj->mt);
       assert(intelImage->mt);
-   } else if (intelImage->base.Border == 0) {
+   } else if (intelImage->base.Base.Border == 0) {
       /* Didn't fit in the object miptree, but it's suitable for inclusion in
        * a miptree, so create one just for our level and store it in the image.
        * It'll get moved into the object miptree at validate time.
@@ -448,7 +448,7 @@ intelTexImage(struct gl_context * ctx,
        intelImage->mt &&
        _mesa_is_bufferobj(unpack->BufferObj) &&
        check_pbo_format(internalFormat, format,
-                        type, intelImage->base.TexFormat)) {
+                        type, intelImage->base.Base.TexFormat)) {
 
       DBG("trying pbo upload\n");
 
@@ -502,10 +502,10 @@ intelTexImage(struct gl_context * ctx,
         }
          texImage->Data = intel_miptree_image_map(intel,
                                                   intelImage->mt,
-                                                  intelImage->base.Face,
-                                                  intelImage->base.Level,
+                                                  intelImage->base.Base.Face,
+                                                  intelImage->base.Base.Level,
                                                   &dstRowStride,
-                                                  intelImage->base.ImageOffsets);
+                                                  intelImage->base.Base.ImageOffsets);
       }
 
       texImage->RowStride = dstRowStride / intelImage->mt->cpp;
@@ -669,25 +669,25 @@ intel_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
       /* Image is stored in hardware format in a buffer managed by the
        * kernel.  Need to explicitly map and unmap it.
        */
-      intelImage->base.Data =
+      intelImage->base.Base.Data =
          intel_miptree_image_map(intel,
                                  intelImage->mt,
-                                 intelImage->base.Face,
-                                 intelImage->base.Level,
-                                 &intelImage->base.RowStride,
-                                 intelImage->base.ImageOffsets);
-      intelImage->base.RowStride /= intelImage->mt->cpp;
+                                 intelImage->base.Base.Face,
+                                 intelImage->base.Base.Level,
+                                 &intelImage->base.Base.RowStride,
+                                 intelImage->base.Base.ImageOffsets);
+      intelImage->base.Base.RowStride /= intelImage->mt->cpp;
    }
    else {
       /* Otherwise, the image should actually be stored in
-       * intelImage->base.Data.  This is pretty confusing for
+       * intelImage->base.Base.Data.  This is pretty confusing for
        * everybody, I'd much prefer to separate the two functions of
        * texImage->Data - storage for texture images in main memory
        * and access (ie mappings) of images.  In other words, we'd
        * create a new texImage->Map field and leave Data simply for
        * storage.
        */
-      assert(intelImage->base.Data);
+      assert(intelImage->base.Base.Data);
    }
 
    if (intelImage->stencil_rb) {
@@ -712,7 +712,7 @@ intel_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
    /* Unmap */
    if (intelImage->mt) {
       intel_miptree_image_unmap(intel, intelImage->mt);
-      intelImage->base.Data = NULL;
+      intelImage->base.Base.Data = NULL;
    }
 }
 
@@ -806,7 +806,7 @@ intelSetTexBuffer2(__DRIcontext *pDRICtx, GLint target,
    texImage->RowStride = rb->region->pitch;
    intel_miptree_reference(&intelImage->mt, intelObj->mt);
 
-   if (!intel_miptree_match_image(intelObj->mt, &intelImage->base)) {
+   if (!intel_miptree_match_image(intelObj->mt, &intelImage->base.Base)) {
           fprintf(stderr, "miptree doesn't match image\n");
    }
 
@@ -862,7 +862,7 @@ intel_image_target_texture_2d(struct gl_context *ctx, GLenum target,
    texImage->RowStride = image->region->pitch;
    intel_miptree_reference(&intelImage->mt, intelObj->mt);
 
-   if (!intel_miptree_match_image(intelObj->mt, &intelImage->base))
+   if (!intel_miptree_match_image(intelObj->mt, &intelImage->base.Base))
       fprintf(stderr, "miptree doesn't match image\n");
 }
 #endif
index e7a4318b8d8d6e04636946c212efcd1934a302d9..8457879a3d83f5ac0b71677709a66f9d199c58c1 100644 (file)
 #ifndef _INTEL_TEX_OBJ_H
 #define _INTEL_TEX_OBJ_H
 
+#include "swrast/s_context.h"
+
+
 struct intel_texture_object
 {
-   struct gl_texture_object base;       /* The "parent" object */
+   struct gl_texture_object base;
 
    /* This is a mirror of base._MaxLevel, updated at validate time,
     * except that we don't bother with the non-base levels for
@@ -48,9 +51,14 @@ struct intel_texture_object
    struct intel_mipmap_tree *mt;
 };
 
+
+/**
+ * intel_texture_image is a subclass of swrast_texture_image because we
+ * sometimes fall back to using the swrast module for software rendering.
+ */
 struct intel_texture_image
 {
-   struct gl_texture_image base;
+   struct swrast_texture_image base;
 
    /* If intelImage->mt != NULL, image data is stored here.
     * Else if intelImage->base.Data != NULL, image is stored there.
index 1492740c2739de29a45bac7b5056a081e096e67d..0da348c8fb85c63f6d7d86a4d2011dac2073994b 100644 (file)
@@ -116,7 +116,7 @@ intel_blit_texsubimage(struct gl_context * ctx,
    dstRowStride = pitch;
 
    intel_miptree_get_image_offset(intelImage->mt, level,
-                                 intelImage->base.Face, 0,
+                                 intelImage->base.Base.Face, 0,
                                  &blit_x, &blit_y);
    blit_x += xoffset;
    blit_y += yoffset;
index f47f12ae58aa7c4e20a8296b193c5b70e903aba4..59f39def204a79fea74ba84910bf167a58e421e8 100644 (file)
@@ -41,26 +41,26 @@ copy_image_data_to_tree(struct intel_context *intel,
        */
       intel_miptree_image_copy(intel,
                                intelObj->mt,
-                               intelImage->base.Face,
-                               intelImage->base.Level, intelImage->mt);
+                               intelImage->base.Base.Face,
+                               intelImage->base.Base.Level, intelImage->mt);
 
       intel_miptree_release(intel, &intelImage->mt);
    }
    else {
-      assert(intelImage->base.Data != NULL);
+      assert(intelImage->base.Base.Data != NULL);
 
       /* More straightforward upload.  
        */
       intel_miptree_image_data(intel,
                                intelObj->mt,
-                               intelImage->base.Face,
-                               intelImage->base.Level,
-                               intelImage->base.Data,
-                               intelImage->base.RowStride,
-                               intelImage->base.RowStride *
-                               intelImage->base.Height);
-      _mesa_align_free(intelImage->base.Data);
-      intelImage->base.Data = NULL;
+                               intelImage->base.Base.Face,
+                               intelImage->base.Base.Level,
+                               intelImage->base.Base.Data,
+                               intelImage->base.Base.RowStride,
+                               intelImage->base.Base.RowStride *
+                               intelImage->base.Base.Height);
+      _mesa_align_free(intelImage->base.Base.Data);
+      intelImage->base.Base.Data = NULL;
    }
 
    intel_miptree_reference(&intelImage->mt, intelObj->mt);
@@ -91,7 +91,7 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
 
    /* Fallback case:
     */
-   if (firstImage->base.Border) {
+   if (firstImage->base.Base.Border) {
       if (intelObj->mt) {
          intel_miptree_release(intel, &intelObj->mt);
       }
@@ -108,12 +108,12 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
     */
    if (intelObj->mt &&
        (intelObj->mt->target != intelObj->base.Target ||
-       intelObj->mt->format != firstImage->base.TexFormat ||
+       intelObj->mt->format != firstImage->base.Base.TexFormat ||
        intelObj->mt->first_level != tObj->BaseLevel ||
        intelObj->mt->last_level < intelObj->_MaxLevel ||
-       intelObj->mt->width0 != firstImage->base.Width ||
-       intelObj->mt->height0 != firstImage->base.Height ||
-       intelObj->mt->depth0 != firstImage->base.Depth)) {
+       intelObj->mt->width0 != firstImage->base.Base.Width ||
+       intelObj->mt->height0 != firstImage->base.Base.Height ||
+       intelObj->mt->depth0 != firstImage->base.Base.Depth)) {
       intel_miptree_release(intel, &intelObj->mt);
    }
 
@@ -123,12 +123,12 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
    if (!intelObj->mt) {
       intelObj->mt = intel_miptree_create(intel,
                                           intelObj->base.Target,
-                                         firstImage->base.TexFormat,
+                                         firstImage->base.Base.TexFormat,
                                           tObj->BaseLevel,
                                           intelObj->_MaxLevel,
-                                          firstImage->base.Width,
-                                          firstImage->base.Height,
-                                          firstImage->base.Depth,
+                                          firstImage->base.Base.Width,
+                                          firstImage->base.Base.Height,
+                                          firstImage->base.Base.Depth,
                                          GL_TRUE);
       if (!intelObj->mt)
          return GL_FALSE;
@@ -173,15 +173,15 @@ intel_tex_map_level_images(struct intel_context *intel,
         intel_texture_image(intelObj->base.Image[face][level]);
 
       if (intelImage && intelImage->mt) {
-        intelImage->base.Data =
+        intelImage->base.Base.Data =
            intel_miptree_image_map(intel,
                                    intelImage->mt,
-                                   intelImage->base.Face,
-                                   intelImage->base.Level,
-                                   &intelImage->base.RowStride,
-                                   intelImage->base.ImageOffsets);
+                                   intelImage->base.Base.Face,
+                                   intelImage->base.Base.Level,
+                                   &intelImage->base.Base.RowStride,
+                                   intelImage->base.Base.ImageOffsets);
         /* convert stride to texels, not bytes */
-        intelImage->base.RowStride /= intelImage->mt->cpp;
+        intelImage->base.Base.RowStride /= intelImage->mt->cpp;
         /* intelImage->base.ImageStride /= intelImage->mt->cpp; */
       }
    }
@@ -201,7 +201,7 @@ intel_tex_unmap_level_images(struct intel_context *intel,
 
       if (intelImage && intelImage->mt) {
         intel_miptree_image_unmap(intel, intelImage->mt);
-        intelImage->base.Data = NULL;
+        intelImage->base.Base.Data = NULL;
       }
    }
 }