From 7378c6479278983de7f1f39902aade0567a53965 Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Tue, 8 Jun 2021 12:05:42 -0700 Subject: [PATCH] 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 Part-of: --- src/gallium/drivers/i915/i915_context.c | 6 - src/gallium/drivers/i915/i915_context.h | 14 -- src/gallium/drivers/i915/i915_screen.c | 5 +- src/gallium/drivers/i915/i915_state.c | 196 +++--------------------- 4 files changed, 19 insertions(+), 202 deletions(-) diff --git a/src/gallium/drivers/i915/i915_context.c b/src/gallium/drivers/i915/i915_context.c index e007486fea1..98851841fc3 100644 --- a/src/gallium/drivers/i915/i915_context.c +++ b/src/gallium/drivers/i915/i915_context.c @@ -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. diff --git a/src/gallium/drivers/i915/i915_context.h b/src/gallium/drivers/i915/i915_context.h index 7db4174cb21..8a90644bc34 100644 --- a/src/gallium/drivers/i915/i915_context.h +++ b/src/gallium/drivers/i915/i915_context.h @@ -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: */ diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c index fed0e3b10e5..54c6f4122a1 100644 --- a/src/gallium/drivers/i915/i915_screen.c +++ b/src/gallium/drivers/i915/i915_screen.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; diff --git a/src/gallium/drivers/i915/i915_state.c b/src/gallium/drivers/i915/i915_state.c index 818b7277c06..bc38908d0d4 100644 --- a/src/gallium/drivers/i915/i915_state.c +++ b/src/gallium/drivers/i915/i915_state.c @@ -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,