[Mesa-dev] [RFC 07/27] i965/wm: Introduce support for texture surface x/y-tile offsets
Topi Pohjolainen
topi.pohjolainen at intel.com
Sat Feb 22 01:05:33 PST 2014
Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
---
src/mesa/drivers/dri/i965/brw_state.h | 7 +++++++
src/mesa/drivers/dri/i965/brw_wm_surface_state.c | 13 ++++++++++++-
src/mesa/drivers/dri/i965/gen7_wm_surface_state.c | 4 +++-
3 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h
index f32597d..fef659b 100644
--- a/src/mesa/drivers/dri/i965/brw_state.h
+++ b/src/mesa/drivers/dri/i965/brw_state.h
@@ -212,6 +212,13 @@ struct brw_wm_surface {
uint32_t page_offset;
unsigned min_lod;
unsigned mip_count;
+
+ /* Offsets within tile. These are needed when mip-level and/or layer
+ * are accessed without native hardware support. Page offset is adjusted
+ * with full pages and the remaining is accounted for here.
+ */
+ unsigned tile_x;
+ unsigned tile_y;
};
void gen4_init_vtable_surface_functions(struct brw_context *brw);
diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
index a27fad1..6f23cec 100644
--- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
+++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
@@ -209,10 +209,19 @@ brw_get_texture_surface(const struct gl_texture_object *tex_obj,
surface->page_offset = 0;
surface->min_lod = tex_obj->BaseLevel - mt->first_level;
surface->mip_count = intel_tex->_MaxLevel - tex_obj->BaseLevel;
+ surface->tile_x = 0;
+ surface->tile_y = 0;
}
surface->page_offset += mt->offset;
+ /* Note that the low bits of these fields are missing, so there's the
+ * possibility of getting in trouble. Hardware wants width as multiples
+ * of four and height of two.
+ */
+ assert(surface->tile_x % 4 == 0);
+ assert(surface->tile_y % 2 == 0);
+
return mt;
}
@@ -360,7 +369,9 @@ brw_update_texture_surface(struct gl_context *ctx,
surf[4] = (brw_get_surface_num_multisamples(mt->num_samples) |
SET_FIELD(tex.min_lod, BRW_SURFACE_MIN_LOD));
- surf[5] = mt->align_h == 4 ? BRW_SURFACE_VERTICAL_ALIGN_ENABLE : 0;
+ surf[5] = SET_FIELD(tex.tile_x / 4, BRW_SURFACE_X_OFFSET) |
+ SET_FIELD(tex.tile_y / 2, BRW_SURFACE_Y_OFFSET) |
+ (mt->align_h == 4 ? BRW_SURFACE_VERTICAL_ALIGN_ENABLE : 0);
/* Emit relocation to surface contents */
drm_intel_bo_emit_reloc(brw->batch.bo,
diff --git a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c
index 8389dcf..e7baa81 100644
--- a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c
+++ b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c
@@ -325,7 +325,9 @@ gen7_update_texture_surface(struct gl_context *ctx,
surf[4] = gen7_surface_msaa_bits(mt->num_samples, mt->msaa_layout);
- surf[5] = SET_FIELD(GEN7_MOCS_L3, GEN7_SURFACE_MOCS) |
+ surf[5] = SET_FIELD(tex.tile_x / 4, BRW_SURFACE_X_OFFSET) |
+ SET_FIELD(tex.tile_y / 2, BRW_SURFACE_Y_OFFSET) |
+ SET_FIELD(GEN7_MOCS_L3, GEN7_SURFACE_MOCS) |
SET_FIELD(tex.min_lod, GEN7_SURFACE_MIN_LOD) |
tex.mip_count;
--
1.8.3.1
More information about the mesa-dev
mailing list