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