浏览代码

intel: Make PBO TexImage use AllocTextureImageBuffer like non-PBO does.

Now that whole block that also lives in AllocTextureImageBuffer can go
away.
tags/mesa-8.0-rc1
Eric Anholt 14 年前
父节点
当前提交
9aff2944a4
共有 2 个文件被更改,包括 21 次插入54 次删除
  1. 6
    0
      src/mesa/drivers/dri/intel/intel_tex.c
  2. 15
    54
      src/mesa/drivers/dri/intel/intel_tex_image.c

+ 6
- 0
src/mesa/drivers/dri/intel/intel_tex.c 查看文件

@@ -60,6 +60,12 @@ intel_alloc_texture_image_buffer(struct gl_context *ctx,
struct gl_texture_object *texobj = image->TexObject;
struct intel_texture_object *intel_texobj = intel_texture_object(texobj);

/* Because the driver uses AllocTextureImageBuffer() internally, it may end
* up mismatched with FreeTextureImageBuffer(), but that is safe to call
* multiple times.
*/
ctx->Driver.FreeTextureImageBuffer(ctx, image);

if (intel->must_use_separate_stencil
&& image->TexFormat == MESA_FORMAT_S8_Z24) {
intel_tex_image_s8z24_create_renderbuffers(intel, intel_image);

+ 15
- 54
src/mesa/drivers/dri/intel/intel_tex_image.c 查看文件

@@ -146,12 +146,14 @@ check_pbo_format(GLenum format, GLenum type,
/* XXX: Do this for TexSubImage also:
*/
static bool
try_pbo_upload(struct intel_context *intel,
struct intel_texture_image *intelImage,
try_pbo_upload(struct gl_context *ctx,
struct gl_texture_image *image,
const struct gl_pixelstore_attrib *unpack,
GLenum format, GLenum type,
GLint width, GLint height, const void *pixels)
{
struct intel_texture_image *intelImage = intel_texture_image(image);
struct intel_context *intel = intel_context(ctx);
struct intel_buffer_object *pbo = intel_buffer_object(unpack->BufferObj);
GLuint src_offset, src_stride;
GLuint dst_x, dst_y, dst_stride;
@@ -162,11 +164,6 @@ try_pbo_upload(struct intel_context *intel,

DBG("trying pbo upload\n");

if (!intelImage->mt) {
DBG("%s: no miptree\n", __FUNCTION__);
return false;
}

if (intel->ctx._ImageTransferState ||
unpack->SkipPixels || unpack->SkipRows) {
DBG("%s: image transfer\n", __FUNCTION__);
@@ -180,6 +177,14 @@ try_pbo_upload(struct intel_context *intel,
return false;
}

ctx->Driver.AllocTextureImageBuffer(ctx, image, image->TexFormat,
width, height, 1);

if (!intelImage->mt) {
DBG("%s: no miptree\n", __FUNCTION__);
return false;
}

dst_buffer = intelImage->mt->region->bo;
src_buffer = intel_bufferobj_source(intel, pbo, 64, &src_offset);
/* note: potential 64-bit ptr to 32-bit int cast */
@@ -349,63 +354,19 @@ intelTexImage(struct gl_context * ctx,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage, GLsizei imageSize)
{
struct intel_context *intel = intel_context(ctx);
struct intel_texture_object *intelObj = intel_texture_object(texObj);
struct intel_texture_image *intelImage = intel_texture_image(texImage);
GLint texelBytes;
GLuint dstRowStride = 0;

DBG("%s target %s level %d %dx%dx%d border %d\n", __FUNCTION__,
_mesa_lookup_enum_by_nr(target), level, width, height, depth, border);

if (_mesa_is_format_compressed(texImage->TexFormat)) {
texelBytes = 0;
}
else {
texelBytes = _mesa_get_format_bytes(texImage->TexFormat);

if (!intelImage->mt) {
assert(texImage->RowStride == width);
}
}

if (intelObj->mt &&
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.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.
*/
intelImage->mt = intel_miptree_create_for_teximage(intel, intelObj,
intelImage,
pixels == NULL);

/* Even if the object currently has a mipmap tree associated
* with it, this one is a more likely candidate to represent the
* whole object since our level didn't fit what was there
* before, and any lower levels would fit into our miptree.
*/
intel_miptree_reference(&intelObj->mt, intelImage->mt);
} else {
/* Allocate fallback texImage->Data storage through swrast. */
ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat,
width, height, depth);
}

/* Attempt to use the blitter for PBO image uploads.
*/
if (dims <= 2 &&
try_pbo_upload(intel, intelImage, unpack, format, type,
try_pbo_upload(ctx, texImage, unpack, format, type,
width, height, pixels)) {
return;
}

DBG("Upload image %dx%dx%d row_len %d pitch %d pixels %d\n",
width, height, depth, width * texelBytes, dstRowStride,
pixels ? 1 : 0);
DBG("%s: upload image %dx%dx%d pixels %p\n",
__FUNCTION__, width, height, depth, pixels);

_mesa_store_teximage3d(ctx, target, level, internalFormat,
width, height, depth, border,

正在加载...
取消
保存