i915: Disable vertex texturing and delete the code.
It's not a required feature of the GL2.1 or GLES2, and you really don't want to be doing SW VS access of the write-combined texture data. Also, avoids memory corruption in deqp: Test case 'dEQP-GLES2.functional.texture.vertex.cube.filtering.linear_mipmap_nearest_linear_repeat'.. Mesa: User error: GL_INVALID_ENUM in glGetIntegerv(pname=GL_MAJOR_VERSION) Fail (Image comparison failed) Test case 'dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_depth_funcs.stencil_equal_depth_always'.. ==559181== Invalid read of size 4 ==559181== at 0x641E8D0: i915_drm_buffer_unmap (i915_drm_buffer.c:204) ==559181== by 0x64151EB: i915_cleanup_vertex_sampling (i915_state.c:449) ==559181== by 0x640AEA7: i915_draw_vbo (i915_context.c:134) ==559181== by 0x640AEA7: i915_draw_vbo (i915_context.c:55) ==559181== by 0x61367B1: cso_draw_vbo (cso_context.c:1524) [...] Reviewed-by: Adam Jackson <ajax@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11329>
This commit is contained in:
parent
87f35032a6
commit
7378c64792
|
@ -113,9 +113,6 @@ i915_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
|
|||
else
|
||||
draw_set_mapped_constant_buffer(draw, PIPE_SHADER_VERTEX, 0, NULL, 0);
|
||||
|
||||
if (i915->num_vertex_sampler_views > 0)
|
||||
i915_prepare_vertex_sampling(i915);
|
||||
|
||||
/*
|
||||
* Do the drawing
|
||||
*/
|
||||
|
@ -130,9 +127,6 @@ i915_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
|
|||
if (mapped_indices)
|
||||
draw_set_indexes(draw, NULL, 0, 0);
|
||||
|
||||
if (i915->num_vertex_sampler_views > 0)
|
||||
i915_cleanup_vertex_sampling(i915);
|
||||
|
||||
/*
|
||||
* Instead of flushing on every state change, we flush once here
|
||||
* when we fire the vbo.
|
||||
|
|
|
@ -247,18 +247,12 @@ struct i915_context {
|
|||
struct pipe_poly_stipple poly_stipple;
|
||||
struct pipe_scissor_state scissor;
|
||||
struct pipe_sampler_view *fragment_sampler_views[PIPE_MAX_SAMPLERS];
|
||||
struct pipe_sampler_view *vertex_sampler_views[PIPE_MAX_SAMPLERS];
|
||||
struct pipe_viewport_state viewport;
|
||||
|
||||
unsigned dirty;
|
||||
|
||||
struct pipe_resource *mapped_vs_tex[PIPE_MAX_SAMPLERS];
|
||||
struct i915_winsys_buffer* mapped_vs_tex_buffer[PIPE_MAX_SAMPLERS];
|
||||
|
||||
unsigned num_samplers;
|
||||
unsigned num_fragment_sampler_views;
|
||||
unsigned num_vertex_samplers;
|
||||
unsigned num_vertex_sampler_views;
|
||||
|
||||
struct i915_winsys_batchbuffer *batch;
|
||||
|
||||
|
@ -357,14 +351,6 @@ struct draw_stage *i915_draw_render_stage( struct i915_context *i915 );
|
|||
struct draw_stage *i915_draw_vbuf_stage( struct i915_context *i915 );
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* i915_state.c:
|
||||
*/
|
||||
void i915_prepare_vertex_sampling(struct i915_context *i915);
|
||||
void i915_cleanup_vertex_sampling(struct i915_context *i915);
|
||||
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* i915_state_emit.c:
|
||||
*/
|
||||
|
|
|
@ -117,10 +117,7 @@ i915_get_shader_param(struct pipe_screen *screen,
|
|||
switch (cap) {
|
||||
case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
|
||||
case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
|
||||
if (debug_get_bool_option("DRAW_USE_LLVM", TRUE))
|
||||
return PIPE_MAX_SAMPLERS;
|
||||
else
|
||||
return 0;
|
||||
return 0;
|
||||
case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
|
||||
case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
|
||||
return 0;
|
||||
|
|
|
@ -293,46 +293,16 @@ i915_create_sampler_state(struct pipe_context *pipe,
|
|||
}
|
||||
|
||||
static void
|
||||
i915_bind_vertex_sampler_states(struct pipe_context *pipe,
|
||||
unsigned start,
|
||||
unsigned num,
|
||||
void **samplers)
|
||||
i915_bind_sampler_states(struct pipe_context *pipe,
|
||||
enum pipe_shader_type shader,
|
||||
unsigned start, unsigned num,
|
||||
void **samplers)
|
||||
{
|
||||
struct i915_context *i915 = i915_context(pipe);
|
||||
unsigned i;
|
||||
|
||||
assert(start + num <= ARRAY_SIZE(i915->vertex_samplers));
|
||||
|
||||
/* Check for no-op */
|
||||
if (num == i915->num_vertex_samplers &&
|
||||
!memcmp(i915->vertex_samplers + start, samplers,
|
||||
num * sizeof(void *)))
|
||||
if (shader != PIPE_SHADER_FRAGMENT) {
|
||||
assert(num == 0);
|
||||
return;
|
||||
|
||||
for (i = 0; i < num; ++i)
|
||||
i915->vertex_samplers[i + start] = samplers[i];
|
||||
|
||||
/* find highest non-null samplers[] entry */
|
||||
{
|
||||
unsigned j = MAX2(i915->num_vertex_samplers, start + num);
|
||||
while (j > 0 && i915->vertex_samplers[j - 1] == NULL)
|
||||
j--;
|
||||
i915->num_vertex_samplers = j;
|
||||
}
|
||||
|
||||
draw_set_samplers(i915->draw,
|
||||
PIPE_SHADER_VERTEX,
|
||||
i915->vertex_samplers,
|
||||
i915->num_vertex_samplers);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void i915_bind_fragment_sampler_states(struct pipe_context *pipe,
|
||||
unsigned start,
|
||||
unsigned num,
|
||||
void **samplers)
|
||||
{
|
||||
struct i915_context *i915 = i915_context(pipe);
|
||||
unsigned i;
|
||||
|
||||
|
@ -357,25 +327,6 @@ static void i915_bind_fragment_sampler_states(struct pipe_context *pipe,
|
|||
}
|
||||
|
||||
|
||||
static void
|
||||
i915_bind_sampler_states(struct pipe_context *pipe,
|
||||
enum pipe_shader_type shader,
|
||||
unsigned start, unsigned num_samplers,
|
||||
void **samplers)
|
||||
{
|
||||
switch (shader) {
|
||||
case PIPE_SHADER_VERTEX:
|
||||
i915_bind_vertex_sampler_states(pipe, start, num_samplers, samplers);
|
||||
break;
|
||||
case PIPE_SHADER_FRAGMENT:
|
||||
i915_bind_fragment_sampler_states(pipe, start, num_samplers, samplers);
|
||||
break;
|
||||
default:
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void i915_delete_sampler_state(struct pipe_context *pipe,
|
||||
void *sampler)
|
||||
{
|
||||
|
@ -383,77 +334,6 @@ static void i915_delete_sampler_state(struct pipe_context *pipe,
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Called before drawing VBO to map vertex samplers and hand them to draw
|
||||
*/
|
||||
void
|
||||
i915_prepare_vertex_sampling(struct i915_context *i915)
|
||||
{
|
||||
struct i915_winsys *iws = i915->iws;
|
||||
unsigned i,j;
|
||||
uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS];
|
||||
uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS];
|
||||
uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS];
|
||||
unsigned num = i915->num_vertex_sampler_views;
|
||||
struct pipe_sampler_view **views = i915->vertex_sampler_views;
|
||||
|
||||
assert(num <= PIPE_MAX_SAMPLERS);
|
||||
if (!num)
|
||||
return;
|
||||
|
||||
for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
|
||||
struct pipe_sampler_view *view = i < num ? views[i] : NULL;
|
||||
|
||||
if (view) {
|
||||
struct pipe_resource *tex = view->texture;
|
||||
struct i915_texture *i915_tex = i915_texture(tex);
|
||||
ubyte *addr;
|
||||
|
||||
/* We're referencing the texture's internal data, so save a
|
||||
* reference to it.
|
||||
*/
|
||||
pipe_resource_reference(&i915->mapped_vs_tex[i], tex);
|
||||
|
||||
i915->mapped_vs_tex_buffer[i] = i915_tex->buffer;
|
||||
addr = iws->buffer_map(iws,
|
||||
i915_tex->buffer,
|
||||
FALSE /* read only */);
|
||||
|
||||
/* Setup array of mipmap level pointers */
|
||||
/* FIXME: handle 3D textures? */
|
||||
for (j = view->u.tex.first_level; j <= tex->last_level; j++) {
|
||||
mip_offsets[j] = i915_texture_offset(i915_tex, j , 0 /* FIXME depth */);
|
||||
row_stride[j] = i915_tex->stride;
|
||||
img_stride[j] = 0; /* FIXME */
|
||||
}
|
||||
|
||||
draw_set_mapped_texture(i915->draw,
|
||||
PIPE_SHADER_VERTEX,
|
||||
i,
|
||||
tex->width0, tex->height0, tex->depth0,
|
||||
view->u.tex.first_level, tex->last_level,
|
||||
0, 0, addr,
|
||||
row_stride, img_stride, mip_offsets);
|
||||
} else
|
||||
i915->mapped_vs_tex[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
i915_cleanup_vertex_sampling(struct i915_context *i915)
|
||||
{
|
||||
struct i915_winsys *iws = i915->iws;
|
||||
unsigned i;
|
||||
for (i = 0; i < ARRAY_SIZE(i915->mapped_vs_tex); i++) {
|
||||
if (i915->mapped_vs_tex_buffer[i]) {
|
||||
iws->buffer_unmap(iws, i915->mapped_vs_tex_buffer[i]);
|
||||
pipe_resource_reference(&i915->mapped_vs_tex[i], NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** XXX move someday? Or consolidate all these simple state setters
|
||||
* into one file.
|
||||
*/
|
||||
|
@ -736,10 +616,19 @@ static void i915_set_constant_buffer(struct pipe_context *pipe,
|
|||
}
|
||||
|
||||
|
||||
static void i915_set_fragment_sampler_views(struct pipe_context *pipe,
|
||||
unsigned num,
|
||||
struct pipe_sampler_view **views)
|
||||
static void
|
||||
i915_set_sampler_views(struct pipe_context *pipe, enum pipe_shader_type shader,
|
||||
unsigned start, unsigned num, unsigned unbind_num_trailing_slots,
|
||||
struct pipe_sampler_view **views)
|
||||
{
|
||||
if (shader != PIPE_SHADER_FRAGMENT) {
|
||||
/* No support for VS samplers, because it would mean accessing the
|
||||
* write-combined maps of the textures, which is very slow. VS samplers
|
||||
* are not a required feature of GL2.1 or GLES2.
|
||||
*/
|
||||
assert(num == 0);
|
||||
return;
|
||||
}
|
||||
struct i915_context *i915 = i915_context(pipe);
|
||||
uint i;
|
||||
|
||||
|
@ -762,55 +651,6 @@ static void i915_set_fragment_sampler_views(struct pipe_context *pipe,
|
|||
i915->dirty |= I915_NEW_SAMPLER_VIEW;
|
||||
}
|
||||
|
||||
static void
|
||||
i915_set_vertex_sampler_views(struct pipe_context *pipe,
|
||||
unsigned num,
|
||||
struct pipe_sampler_view **views)
|
||||
{
|
||||
struct i915_context *i915 = i915_context(pipe);
|
||||
uint i;
|
||||
|
||||
assert(num <= ARRAY_SIZE(i915->vertex_sampler_views));
|
||||
|
||||
/* Check for no-op */
|
||||
if (views && num == i915->num_vertex_sampler_views &&
|
||||
!memcmp(i915->vertex_sampler_views, views, num * sizeof(struct pipe_sampler_view *))) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(i915->vertex_sampler_views); i++) {
|
||||
struct pipe_sampler_view *view = i < num ? views[i] : NULL;
|
||||
|
||||
pipe_sampler_view_reference(&i915->vertex_sampler_views[i], view);
|
||||
}
|
||||
|
||||
i915->num_vertex_sampler_views = num;
|
||||
|
||||
draw_set_sampler_views(i915->draw,
|
||||
PIPE_SHADER_VERTEX,
|
||||
i915->vertex_sampler_views,
|
||||
i915->num_vertex_sampler_views);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
i915_set_sampler_views(struct pipe_context *pipe, enum pipe_shader_type shader,
|
||||
unsigned start, unsigned num, unsigned unbind_num_trailing_slots,
|
||||
struct pipe_sampler_view **views)
|
||||
{
|
||||
assert(start == 0);
|
||||
switch (shader) {
|
||||
case PIPE_SHADER_FRAGMENT:
|
||||
i915_set_fragment_sampler_views(pipe, num, views);
|
||||
break;
|
||||
case PIPE_SHADER_VERTEX:
|
||||
i915_set_vertex_sampler_views(pipe, num, views);
|
||||
break;
|
||||
default:
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
struct pipe_sampler_view *
|
||||
i915_create_sampler_view_custom(struct pipe_context *pipe,
|
||||
|
|
Loading…
Reference in New Issue