diff options
author | Eric Anholt <[email protected]> | 2017-09-27 15:06:09 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2017-10-10 11:42:05 -0700 |
commit | c25de31824a64873a9000ce10b90fcf493050a8a (patch) | |
tree | 3cefc401b43f7c0d1163643ab8dbc4b807170210 /src | |
parent | e74a9e8def040d55d994c5233bca0ddcccda42d5 (diff) |
broadcom/vc5: Add proper support for base_vertex and base_instance.
I had base_vertex hacked into the shader state setup like in vc4, but it's
not correct for big offsets. Using the proper packet is easier and
hopefully means we can re-emit shader state setup less frequently.
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/vc5/vc5_context.h | 2 | ||||
-rw-r--r-- | src/gallium/drivers/vc5/vc5_draw.c | 40 | ||||
-rw-r--r-- | src/gallium/drivers/vc5/vc5_screen.c | 2 |
3 files changed, 24 insertions, 20 deletions
diff --git a/src/gallium/drivers/vc5/vc5_context.h b/src/gallium/drivers/vc5/vc5_context.h index b8f3f784a85..cac623adf26 100644 --- a/src/gallium/drivers/vc5/vc5_context.h +++ b/src/gallium/drivers/vc5/vc5_context.h @@ -304,8 +304,6 @@ struct vc5_context { /** Maximum index buffer valid for the current shader_rec. */ uint32_t max_index; - /** Last index bias baked into the current shader_rec. */ - uint32_t last_index_bias; /** Seqno of the last CL flush's job. */ uint64_t last_emit_seqno; diff --git a/src/gallium/drivers/vc5/vc5_draw.c b/src/gallium/drivers/vc5/vc5_draw.c index d78fa3265fd..f764f41ce15 100644 --- a/src/gallium/drivers/vc5/vc5_draw.c +++ b/src/gallium/drivers/vc5/vc5_draw.c @@ -150,8 +150,7 @@ vc5_get_default_values(struct vc5_context *vc5) static void vc5_emit_gl_shader_state(struct vc5_context *vc5, - const struct pipe_draw_info *info, - uint32_t extra_index_bias) + const struct pipe_draw_info *info) { struct vc5_job *job = vc5->job; /* VC5_DIRTY_VTXSTATE */ @@ -242,9 +241,7 @@ vc5_emit_gl_shader_state(struct vc5_context *vc5, const struct util_format_description *desc = util_format_description(elem->src_format); - uint32_t offset = (vb->buffer_offset + - elem->src_offset + - vb->stride * info->index_bias); + uint32_t offset = vb->buffer_offset + elem->src_offset; cl_emit(&job->indirect, GL_SHADER_STATE_ATTRIBUTE_RECORD, attr) { uint32_t r_size = desc->channel[0].size; @@ -380,22 +377,31 @@ vc5_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) vc5_emit_state(pctx); - if ((vc5->dirty & (VC5_DIRTY_VTXBUF | - VC5_DIRTY_VTXSTATE | - VC5_DIRTY_PRIM_MODE | - VC5_DIRTY_RASTERIZER | - VC5_DIRTY_COMPILED_CS | - VC5_DIRTY_COMPILED_VS | - VC5_DIRTY_COMPILED_FS | - vc5->prog.cs->uniform_dirty_bits | - vc5->prog.vs->uniform_dirty_bits | - vc5->prog.fs->uniform_dirty_bits)) || - vc5->last_index_bias != info->index_bias) { - vc5_emit_gl_shader_state(vc5, info, 0); + if (vc5->dirty & (VC5_DIRTY_VTXBUF | + VC5_DIRTY_VTXSTATE | + VC5_DIRTY_PRIM_MODE | + VC5_DIRTY_RASTERIZER | + VC5_DIRTY_COMPILED_CS | + VC5_DIRTY_COMPILED_VS | + VC5_DIRTY_COMPILED_FS | + vc5->prog.cs->uniform_dirty_bits | + vc5->prog.vs->uniform_dirty_bits | + vc5->prog.fs->uniform_dirty_bits)) { + vc5_emit_gl_shader_state(vc5, info); } vc5->dirty = 0; + /* The Base Vertex/Base Instance packet sets those values to nonzero + * for the next draw call only. + */ + if (info->index_bias || info->start_instance) { + cl_emit(&job->bcl, BASE_VERTEX_BASE_INSTANCE, base) { + base.base_instance = info->start_instance; + base.base_vertex = info->index_bias; + } + } + /* Note that the primitive type fields match with OpenGL/gallium * definitions, up to but not including QUADS. */ diff --git a/src/gallium/drivers/vc5/vc5_screen.c b/src/gallium/drivers/vc5/vc5_screen.c index d3c9f0962e3..792d430722b 100644 --- a/src/gallium/drivers/vc5/vc5_screen.c +++ b/src/gallium/drivers/vc5/vc5_screen.c @@ -97,6 +97,7 @@ vc5_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_TEXTURE_MULTISAMPLE: case PIPE_CAP_TEXTURE_SWIZZLE: case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR: + case PIPE_CAP_START_INSTANCE: case PIPE_CAP_TGSI_INSTANCEID: case PIPE_CAP_SM3: case PIPE_CAP_INDEP_BLEND_ENABLE: /* XXX */ @@ -159,7 +160,6 @@ vc5_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY: case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY: case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY: - case PIPE_CAP_START_INSTANCE: case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS: case PIPE_CAP_SHADER_STENCIL_EXPORT: case PIPE_CAP_TGSI_TEXCOORD: |