summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/i915/i915_texstate.c
diff options
context:
space:
mode:
authorXiang, Haihao <haihao.xiang@intel.com>2007-08-13 11:43:37 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2007-08-13 11:43:37 +0800
commitc9e4aa2b303f9056564724ece0e2733a54d9f569 (patch)
treee1b7aec0f59b50f39b94efdb6d3d5c6ffeb49467 /src/mesa/drivers/dri/i915/i915_texstate.c
parent21b37b9687b078297935062e3ad9f379b6f36519 (diff)
i915: satisfy certain alignment restrictions for small
compressed texture
Diffstat (limited to 'src/mesa/drivers/dri/i915/i915_texstate.c')
-rw-r--r--src/mesa/drivers/dri/i915/i915_texstate.c57
1 files changed, 53 insertions, 4 deletions
diff --git a/src/mesa/drivers/dri/i915/i915_texstate.c b/src/mesa/drivers/dri/i915/i915_texstate.c
index a19d4b6584..2b806cc36e 100644
--- a/src/mesa/drivers/dri/i915/i915_texstate.c
+++ b/src/mesa/drivers/dri/i915/i915_texstate.c
@@ -60,6 +60,33 @@ static GLint step_offsets[6][2] = { {0,2},
#define I915_TEX_UNIT_ENABLED(unit) (1<<unit)
+static GLuint i915_compressed_alignment(GLint internal_fmt)
+{
+ GLuint alignment = 4;
+
+ switch (internal_fmt) {
+ case GL_COMPRESSED_RGB_FXT1_3DFX:
+ case GL_COMPRESSED_RGBA_FXT1_3DFX:
+ alignment = 8;
+ break;
+
+ default:
+ break;
+ }
+
+ return alignment;
+}
+
+static int align(int value, GLuint alignment)
+{
+ return (value + alignment - 1) & ~(alignment - 1);
+}
+
+static GLuint minify(GLuint d)
+{
+ return MAX2(1, d >> 1);
+}
+
static void i915LayoutTextureImages( i915ContextPtr i915,
struct gl_texture_object *tObj )
{
@@ -161,8 +188,15 @@ static void i915LayoutTextureImages( i915ContextPtr i915,
break;
}
default:
- pitch = tObj->Image[0][firstLevel]->Width * t->intel.texelBytes;
- pitch = (pitch + 3) & ~3;
+ if (baseImage->IsCompressed) {
+ GLuint alignment = i915_compressed_alignment(baseImage->InternalFormat);
+
+ pitch = align(tObj->Image[0][firstLevel]->Width, alignment) * t->intel.texelBytes;
+ } else {
+ pitch = tObj->Image[0][firstLevel]->Width * t->intel.texelBytes;
+ pitch = (pitch + 3) & ~3;
+ }
+
t->intel.base.dirty_images[0] = ~0;
for ( total_height = i = 0 ; i < numLevels ; i++ ) {
@@ -343,8 +377,23 @@ static void i945LayoutTextureImages( i915ContextPtr i915,
break;
}
default:
- pitch = tObj->Image[0][firstLevel]->Width * t->intel.texelBytes;
- pitch = (pitch + 3) & ~3;
+ if (baseImage->IsCompressed) {
+ GLuint alignment = i915_compressed_alignment(baseImage->InternalFormat);
+
+ pitch = align(tObj->Image[0][firstLevel]->Width, alignment);
+ if (numLevels > 2) {
+ GLint width0 = align(minify(tObj->Image[0][firstLevel]->Width), alignment) +
+ + align(minify(minify(tObj->Image[0][firstLevel]->Width)), alignment);
+
+ if (width0 > pitch)
+ pitch = width0;
+ }
+ pitch = pitch * t->intel.texelBytes;
+ } else {
+ pitch = tObj->Image[0][firstLevel]->Width * t->intel.texelBytes;
+ pitch = (pitch + 3) & ~3;
+ }
+
t->intel.base.dirty_images[0] = ~0;
max_offset = 0;