mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-03 14:18:07 +02:00
i915g: Fix offset for level != 0
For NPOT texture layouts, we want to be able to access texture levels other than 0 directly. Since the hw doesn't support that, We do it by adding the offset directly. Signed-off-by: Stéphane Marchesin <marcheu@chromium.org>
This commit is contained in:
parent
a9b0787076
commit
0220a428d7
5 changed files with 27 additions and 8 deletions
|
|
@ -157,7 +157,7 @@ struct i915_state
|
|||
unsigned sampler_enable_nr;
|
||||
|
||||
/* texture image buffers */
|
||||
unsigned texbuffer[I915_TEX_UNITS][2];
|
||||
unsigned texbuffer[I915_TEX_UNITS][3];
|
||||
|
||||
/** Describes the current hardware vertex layout */
|
||||
struct vertex_info vertex_info;
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ struct i915_texture {
|
|||
struct i915_winsys_buffer *buffer;
|
||||
};
|
||||
|
||||
unsigned i915_texture_offset(struct i915_texture *tex,
|
||||
unsigned i915_texture_offset(const struct i915_texture *tex,
|
||||
unsigned level, unsigned layer);
|
||||
void i915_init_screen_resource_functions(struct i915_screen *is);
|
||||
void i915_init_resource_functions(struct i915_context *i915);
|
||||
|
|
|
|||
|
|
@ -143,7 +143,7 @@ i915_texture_set_level_info(struct i915_texture *tex,
|
|||
tex->image_offset[level][0].nblocksy = 0;
|
||||
}
|
||||
|
||||
INLINE unsigned i915_texture_offset(struct i915_texture *tex,
|
||||
unsigned i915_texture_offset(const struct i915_texture *tex,
|
||||
unsigned level, unsigned layer)
|
||||
{
|
||||
unsigned x, y;
|
||||
|
|
|
|||
|
|
@ -326,11 +326,13 @@ emit_map(struct i915_context *i915)
|
|||
if (enabled & (1 << unit)) {
|
||||
struct i915_texture *texture = i915_texture(i915->fragment_sampler_views[unit]->texture);
|
||||
struct i915_winsys_buffer *buf = texture->buffer;
|
||||
unsigned offset = i915->current.texbuffer[unit][2];
|
||||
|
||||
assert(buf);
|
||||
|
||||
count++;
|
||||
|
||||
OUT_RELOC(buf, I915_USAGE_SAMPLER, 0);
|
||||
OUT_RELOC(buf, I915_USAGE_SAMPLER, offset);
|
||||
OUT_BATCH(i915->current.texbuffer[unit][0]); /* MS3 */
|
||||
OUT_BATCH(i915->current.texbuffer[unit][1]); /* MS4 */
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ static void update_map(struct i915_context *i915,
|
|||
const struct i915_texture *tex,
|
||||
const struct i915_sampler_state *sampler,
|
||||
const struct pipe_sampler_view* view,
|
||||
uint state[2]);
|
||||
uint state[3]);
|
||||
|
||||
|
||||
|
||||
|
|
@ -300,13 +300,25 @@ static void update_map(struct i915_context *i915,
|
|||
const struct i915_texture *tex,
|
||||
const struct i915_sampler_state *sampler,
|
||||
const struct pipe_sampler_view* view,
|
||||
uint state[2])
|
||||
uint state[3])
|
||||
{
|
||||
const struct pipe_resource *pt = &tex->b.b;
|
||||
uint format, pitch;
|
||||
const uint width = pt->width0, height = pt->height0, depth = pt->depth0;
|
||||
uint width = pt->width0, height = pt->height0, depth = pt->depth0;
|
||||
const uint num_levels = pt->last_level;
|
||||
uint format, pitch;
|
||||
unsigned max_lod = num_levels * 4;
|
||||
int first_level = view->u.tex.first_level;
|
||||
bool is_npot = (!util_is_power_of_two(pt->width0) || !util_is_power_of_two(pt->height0));
|
||||
|
||||
/*
|
||||
* This is a bit messy. i915 doesn't support NPOT with mipmaps, but we can
|
||||
* still texture from a single level. This is useful to make u_blitter work.
|
||||
*/
|
||||
if (is_npot) {
|
||||
width = u_minify(width, first_level);
|
||||
height = u_minify(height, first_level);
|
||||
max_lod = 1;
|
||||
}
|
||||
|
||||
assert(tex);
|
||||
assert(width);
|
||||
|
|
@ -341,6 +353,11 @@ static void update_map(struct i915_context *i915,
|
|||
| MS4_CUBE_FACE_ENA_MASK
|
||||
| ((max_lod) << MS4_MAX_LOD_SHIFT)
|
||||
| ((depth - 1) << MS4_VOLUME_DEPTH_SHIFT));
|
||||
|
||||
if (is_npot)
|
||||
state[2] = i915_texture_offset(tex, first_level, 0);
|
||||
else
|
||||
state[2] = 0;
|
||||
}
|
||||
|
||||
static void update_maps(struct i915_context *i915)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue