mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2024-11-23 18:24:13 +08:00
vc4: mark buffers as initialized at vc4_texture_subdata
This fixes several tests when the initially uploaded buffer from CPU was being ignored because vc4_texture_subdata was not marking the resource as written/initialized. The usage flags management available at vc4_resource_transfer_map is generalized into vc4_map_usage_prep and reused at vc4_resource_transfer_map. This makes vc4 implementation more similar to v3d. This fixes 7 text in the following subgroups: -dEQP-GLES2.functional.fbo.render.texsubimage.* -dEQP-GLES2.functional.texture.specification.basic_copytexsubimage2d.* -spec@arb_clear_texture@arb_clear_texture-* Cc: mesa-stable Reviewed-by: Juan A. Suarez <jasuarez@igalia.com> Reviewed-by: Emma Anholt <emma@anholt.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25297>
This commit is contained in:
parent
7c538b5ad8
commit
cb96dab5c8
@ -18,11 +18,6 @@ dEQP-GLES2.functional.clipping.line.wide_line_clip_viewport_corner,Fail
|
|||||||
|
|
||||||
dEQP-GLES2.functional.depth_stencil_clear.depth_stencil_masked,Fail
|
dEQP-GLES2.functional.depth_stencil_clear.depth_stencil_masked,Fail
|
||||||
|
|
||||||
# A glTexImage, glDraw, glTexSubImage sequence into a texture is missing what looks like the drawing.
|
|
||||||
dEQP-GLES2.functional.fbo.render.texsubimage.after_render_tex2d_rgba,Fail
|
|
||||||
# A glTexImage, glDraw, glTexSubImage, glDraw sequence into a texture is missing what looks like the first drawing.
|
|
||||||
dEQP-GLES2.functional.fbo.render.texsubimage.between_render_tex2d_rgba,Fail
|
|
||||||
|
|
||||||
# Sampling grid slightly off in test 2?
|
# Sampling grid slightly off in test 2?
|
||||||
dEQP-GLES2.functional.texture.filtering.2d.nearest_mipmap_linear_linear_mirror_rgba8888,Fail
|
dEQP-GLES2.functional.texture.filtering.2d.nearest_mipmap_linear_linear_mirror_rgba8888,Fail
|
||||||
dEQP-GLES2.functional.texture.filtering.2d.nearest_mipmap_linear_linear_repeat_rgba8888,Fail
|
dEQP-GLES2.functional.texture.filtering.2d.nearest_mipmap_linear_linear_repeat_rgba8888,Fail
|
||||||
@ -38,12 +33,6 @@ dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_linear_clamp_non_square,Fa
|
|||||||
dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_linear_mirror_non_square,Fail
|
dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_linear_mirror_non_square,Fail
|
||||||
dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_linear_repeat_non_square,Fail
|
dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_linear_repeat_non_square,Fail
|
||||||
|
|
||||||
# Sequence of glTexImage, glDraw, glCopyTexSubImage.
|
|
||||||
# background red/green checkerboard on the left side is incorrectly white.
|
|
||||||
dEQP-GLES2.functional.texture.specification.basic_copytexsubimage2d.2d_rgba,Fail
|
|
||||||
# Maybe it was copied as RGB instead of RGBA?
|
|
||||||
dEQP-GLES2.functional.texture.specification.basic_copytexsubimage2d.cube_rgba,Fail
|
|
||||||
|
|
||||||
# One of the pixels on the left edge near the bottom is wrong for both min and
|
# One of the pixels on the left edge near the bottom is wrong for both min and
|
||||||
# mag. Also a line of pixels through the image in minification.
|
# mag. Also a line of pixels through the image in minification.
|
||||||
dEQP-GLES2.functional.texture.wrap.clamp_clamp_nearest_npot_etc1,Fail
|
dEQP-GLES2.functional.texture.wrap.clamp_clamp_nearest_npot_etc1,Fail
|
||||||
@ -784,11 +773,8 @@ spec@!opengl 1.1@clipflat@glDrawElements(GL_TRIANGLE_STRIP)- glFrontFace(GL_CW)-
|
|||||||
spec@!opengl 1.1@clipflat@glDrawElements(GL_TRIANGLE_STRIP)- glFrontFace(GL_CW)- glPolygonMode(GL_LINE)- quadrant: right middle PV: FIRST,Fail
|
spec@!opengl 1.1@clipflat@glDrawElements(GL_TRIANGLE_STRIP)- glFrontFace(GL_CW)- glPolygonMode(GL_LINE)- quadrant: right middle PV: FIRST,Fail
|
||||||
spec@!opengl 1.1@clipflat@glDrawElements(GL_TRIANGLE_STRIP)- glFrontFace(GL_CW)- glPolygonMode(GL_LINE)- quadrant: right top PV: FIRST,Fail
|
spec@!opengl 1.1@clipflat@glDrawElements(GL_TRIANGLE_STRIP)- glFrontFace(GL_CW)- glPolygonMode(GL_LINE)- quadrant: right top PV: FIRST,Fail
|
||||||
spec@arb_clear_texture@arb_clear_texture-3d,Fail
|
spec@arb_clear_texture@arb_clear_texture-3d,Fail
|
||||||
spec@arb_clear_texture@arb_clear_texture-base-formats,Fail
|
|
||||||
spec@arb_clear_texture@arb_clear_texture-depth,Fail
|
spec@arb_clear_texture@arb_clear_texture-depth,Fail
|
||||||
spec@arb_clear_texture@arb_clear_texture-depth-stencil,Fail
|
|
||||||
spec@arb_clear_texture@arb_clear_texture-sized-formats,Fail
|
spec@arb_clear_texture@arb_clear_texture-sized-formats,Fail
|
||||||
spec@arb_clear_texture@arb_clear_texture-srgb,Fail
|
|
||||||
spec@arb_clear_texture@arb_clear_texture-supported-formats,Fail
|
spec@arb_clear_texture@arb_clear_texture-supported-formats,Fail
|
||||||
spec@glsl-1.10@execution@glsl-fs-inline-explosion,Crash
|
spec@glsl-1.10@execution@glsl-fs-inline-explosion,Crash
|
||||||
spec@glsl-1.10@execution@glsl-vs-inline-explosion,Crash
|
spec@glsl-1.10@execution@glsl-vs-inline-explosion,Crash
|
||||||
|
@ -95,6 +95,46 @@ vc4_resource_transfer_unmap(struct pipe_context *pctx,
|
|||||||
slab_free(&vc4->transfer_pool, ptrans);
|
slab_free(&vc4->transfer_pool, ptrans);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
vc4_map_usage_prep(struct pipe_context *pctx,
|
||||||
|
struct pipe_resource *prsc,
|
||||||
|
unsigned usage)
|
||||||
|
{
|
||||||
|
struct vc4_context *vc4 = vc4_context(pctx);
|
||||||
|
struct vc4_resource *rsc = vc4_resource(prsc);
|
||||||
|
|
||||||
|
if (usage & PIPE_MAP_DISCARD_WHOLE_RESOURCE) {
|
||||||
|
if (vc4_resource_bo_alloc(rsc)) {
|
||||||
|
/* If it might be bound as one of our vertex buffers,
|
||||||
|
* make sure we re-emit vertex buffer state.
|
||||||
|
*/
|
||||||
|
if (prsc->bind & PIPE_BIND_VERTEX_BUFFER)
|
||||||
|
vc4->dirty |= VC4_DIRTY_VTXBUF;
|
||||||
|
if (prsc->bind & PIPE_BIND_CONSTANT_BUFFER)
|
||||||
|
vc4->dirty |= VC4_DIRTY_CONSTBUF;
|
||||||
|
} else {
|
||||||
|
/* If we failed to reallocate, flush users so that we
|
||||||
|
* don't violate any syncing requirements.
|
||||||
|
*/
|
||||||
|
vc4_flush_jobs_reading_resource(vc4, prsc);
|
||||||
|
}
|
||||||
|
} else if (!(usage & PIPE_MAP_UNSYNCHRONIZED)) {
|
||||||
|
/* If we're writing and the buffer is being used by the CL, we
|
||||||
|
* have to flush the CL first. If we're only reading, we need
|
||||||
|
* to flush if the CL has written our buffer.
|
||||||
|
*/
|
||||||
|
if (usage & PIPE_MAP_WRITE)
|
||||||
|
vc4_flush_jobs_reading_resource(vc4, prsc);
|
||||||
|
else
|
||||||
|
vc4_flush_jobs_writing_resource(vc4, prsc);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (usage & PIPE_MAP_WRITE) {
|
||||||
|
rsc->writes++;
|
||||||
|
rsc->initialized_buffers = ~0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
vc4_resource_transfer_map(struct pipe_context *pctx,
|
vc4_resource_transfer_map(struct pipe_context *pctx,
|
||||||
struct pipe_resource *prsc,
|
struct pipe_resource *prsc,
|
||||||
@ -124,34 +164,7 @@ vc4_resource_transfer_map(struct pipe_context *pctx,
|
|||||||
usage |= PIPE_MAP_DISCARD_WHOLE_RESOURCE;
|
usage |= PIPE_MAP_DISCARD_WHOLE_RESOURCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usage & PIPE_MAP_DISCARD_WHOLE_RESOURCE) {
|
vc4_map_usage_prep(pctx, prsc, usage);
|
||||||
if (vc4_resource_bo_alloc(rsc)) {
|
|
||||||
/* If it might be bound as one of our vertex buffers,
|
|
||||||
* make sure we re-emit vertex buffer state.
|
|
||||||
*/
|
|
||||||
if (prsc->bind & PIPE_BIND_VERTEX_BUFFER)
|
|
||||||
vc4->dirty |= VC4_DIRTY_VTXBUF;
|
|
||||||
} else {
|
|
||||||
/* If we failed to reallocate, flush users so that we
|
|
||||||
* don't violate any syncing requirements.
|
|
||||||
*/
|
|
||||||
vc4_flush_jobs_reading_resource(vc4, prsc);
|
|
||||||
}
|
|
||||||
} else if (!(usage & PIPE_MAP_UNSYNCHRONIZED)) {
|
|
||||||
/* If we're writing and the buffer is being used by the CL, we
|
|
||||||
* have to flush the CL first. If we're only reading, we need
|
|
||||||
* to flush if the CL has written our buffer.
|
|
||||||
*/
|
|
||||||
if (usage & PIPE_MAP_WRITE)
|
|
||||||
vc4_flush_jobs_reading_resource(vc4, prsc);
|
|
||||||
else
|
|
||||||
vc4_flush_jobs_writing_resource(vc4, prsc);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (usage & PIPE_MAP_WRITE) {
|
|
||||||
rsc->writes++;
|
|
||||||
rsc->initialized_buffers = ~0;
|
|
||||||
}
|
|
||||||
|
|
||||||
trans = slab_zalloc(&vc4->transfer_pool);
|
trans = slab_zalloc(&vc4->transfer_pool);
|
||||||
if (!trans)
|
if (!trans)
|
||||||
@ -240,8 +253,12 @@ vc4_texture_subdata(struct pipe_context *pctx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Otherwise, map and store the texture data directly into the tiled
|
/* Otherwise, map and store the texture data directly into the tiled
|
||||||
* texture.
|
* texture. Note that gallium's texture_subdata may be called with
|
||||||
|
* obvious usage flags missing!
|
||||||
*/
|
*/
|
||||||
|
vc4_map_usage_prep(pctx, prsc, usage | (PIPE_MAP_WRITE |
|
||||||
|
PIPE_MAP_DISCARD_RANGE));
|
||||||
|
|
||||||
void *buf;
|
void *buf;
|
||||||
if (usage & PIPE_MAP_UNSYNCHRONIZED)
|
if (usage & PIPE_MAP_UNSYNCHRONIZED)
|
||||||
buf = vc4_bo_map_unsynchronized(rsc->bo);
|
buf = vc4_bo_map_unsynchronized(rsc->bo);
|
||||||
|
Loading…
Reference in New Issue
Block a user