i915: Add render and texture support for tiled texture and buffers
authorJakob Bornecrantz <jakob@tungstengraphics.com>
Mon, 23 Jun 2008 15:57:45 +0000 (17:57 +0200)
committerJakob Bornecrantz <jakob@tungstengraphics.com>
Mon, 23 Jun 2008 16:36:36 +0000 (18:36 +0200)
This is step towards tiled textures and buffer support for
i915. But the tiled attribute is never set.

src/gallium/drivers/i915simple/i915_context.h
src/gallium/drivers/i915simple/i915_state_emit.c
src/gallium/drivers/i915simple/i915_state_sampler.c
src/gallium/drivers/i915simple/i915_texture.c

index 9e02f78..5d411a6 100644 (file)
@@ -192,6 +192,8 @@ struct i915_texture {
    unsigned depth_pitch;          /* per-image on i945? */
    unsigned total_height;
 
+   unsigned tiled;
+
    unsigned nr_images[PIPE_MAX_TEXTURE_LEVELS];
 
    /* Explicitly store the offset of each image for each cube face or
index bc801a8..19d968f 100644 (file)
@@ -213,10 +213,10 @@ i915_emit_hardware_state(struct i915_context *i915 )
       if (cbuf_surface) {
         unsigned cpitch = (cbuf_surface->pitch * cbuf_surface->cpp);
         unsigned ctile = BUF_3D_USE_FENCE;
-#if 0
-        if (!((cpitch - 1) & cpitch) && cpitch >= 512)
+        if (cbuf_surface->texture &&
+              ((struct i915_texture*)(cbuf_surface->texture))->tiled) {
            ctile = BUF_3D_TILED_SURFACE;
-#endif
+        }
 
         OUT_BATCH(_3DSTATE_BUF_INFO_CMD);
 
@@ -234,10 +234,10 @@ i915_emit_hardware_state(struct i915_context *i915 )
       if (depth_surface) {
         unsigned zpitch = (depth_surface->pitch * depth_surface->cpp);
         unsigned ztile = BUF_3D_USE_FENCE;
-#if 0
-        if (!((zpitch - 1) & zpitch) && zpitch >= 512)
+        if (depth_surface->texture &&
+              ((struct i915_texture*)(depth_surface->texture))->tiled) {
            ztile = BUF_3D_TILED_SURFACE;
-#endif
+        }
 
         OUT_BATCH(_3DSTATE_BUF_INFO_CMD);
 
index 2444084..379aff3 100644 (file)
@@ -234,6 +234,7 @@ i915_update_texture(struct i915_context *i915,
    const uint width = pt->width[0], height = pt->height[0], depth = pt->depth[0];
    const uint num_levels = pt->last_level;
    unsigned max_lod = num_levels * 4;
+   unsigned tiled = MS3_USE_FENCE_REGS;
 
    assert(tex);
    assert(width);
@@ -246,12 +247,17 @@ i915_update_texture(struct i915_context *i915,
    assert(format);
    assert(pitch);
 
+   if (tex->tiled) {
+      assert(!((pitch - 1) & pitch));
+      tiled = MS3_TILED_SURFACE;
+   }
+
    /* MS3 state */
    state[0] =
       (((height - 1) << MS3_HEIGHT_SHIFT)
        | ((width - 1) << MS3_WIDTH_SHIFT)
        | format
-       | MS3_USE_FENCE_REGS);
+       | tiled);
 
    /*
     * XXX When min_filter != mag_filter and there's just one mipmap level,
index d9b33df..ae107c6 100644 (file)
@@ -174,6 +174,7 @@ i915_displaytarget_layout(struct i915_texture *tex)
    if (tex->base.width[0] >= 128) {
       tex->pitch = power_of_two(tex->base.width[0] * pt->cpp) / pt->cpp;
       tex->total_height = round_up(tex->base.height[0], 8);
+      tex->tiled = 1;
    } else {
       tex->pitch = round_up(tex->base.width[0], 64 / pt->cpp);
       tex->total_height = tex->base.height[0];