diff options
author | Dave Airlie <airlied@gmail.com> | 2015-03-19 14:21:55 +1000 |
---|---|---|
committer | Dave Airlie <airlied@gmail.com> | 2015-03-19 14:21:55 +1000 |
commit | b3d55898973fb719c69fffba3c4ef31054e34b8c (patch) | |
tree | 139d8ab0074692024f6f559b82ca181d13a60e8d | |
parent | 9259bc768e3e60ee6adb2a0ba1b2925d1b7a912e (diff) |
renderer: split vertex element/vbo binding code out
this just moves the code to a separate function,
without changing anything.
-rw-r--r-- | src/vrend_renderer.c | 203 |
1 files changed, 106 insertions, 97 deletions
diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c index 87331c0..99eb90f 100644 --- a/src/vrend_renderer.c +++ b/src/vrend_renderer.c @@ -2212,6 +2212,111 @@ static GLenum get_xfb_mode(GLenum mode) return GL_POINTS; } +static void vrend_draw_bind_vertex_legacy(struct vrend_context *ctx, + struct vrend_vertex_element_array *va) +{ + uint32_t num_enable; + uint32_t enable_bitmask; + uint32_t disable_bitmask; + int i; + + num_enable = va->count; + enable_bitmask = 0; + disable_bitmask = ~((1ull << num_enable) - 1); + for (i = 0; i < va->count; i++) { + struct vrend_vertex_element *ve = &va->elements[i]; + int vbo_index = ve->base.vertex_buffer_index; + struct vrend_buffer *buf; + GLint loc; + + if (i >= ctx->sub->prog->ss[PIPE_SHADER_VERTEX]->sel->sinfo.num_inputs) { + /* XYZZY: debug this? */ + num_enable = ctx->sub->prog->ss[PIPE_SHADER_VERTEX]->sel->sinfo.num_inputs; + break; + } + buf = (struct vrend_buffer *)ctx->sub->vbo[vbo_index].buffer; + + if (!buf) { + fprintf(stderr,"cannot find vbo buf %d %d %d\n", i, va->count, ctx->sub->prog->ss[PIPE_SHADER_VERTEX]->sel->sinfo.num_inputs); + continue; + } + + if (vrend_shader_use_explicit) { + loc = i; + } else { + if (ctx->sub->prog->attrib_locs) { + loc = ctx->sub->prog->attrib_locs[i]; + } else loc = -1; + + if (loc == -1) { + fprintf(stderr,"%s: cannot find loc %d %d %d\n", ctx->debug_name, i, va->count, ctx->sub->prog->ss[PIPE_SHADER_VERTEX]->sel->sinfo.num_inputs); + num_enable--; + if (i == 0) { + fprintf(stderr,"%s: shader probably didn't compile - skipping rendering\n", ctx->debug_name); + return; + } + continue; + } + } + + if (ve->type == GL_FALSE) { + fprintf(stderr,"failed to translate vertex type - skipping render\n"); + return; + } + + glBindBuffer(GL_ARRAY_BUFFER, buf->base.id); + + if (ctx->sub->vbo[vbo_index].stride == 0) { + void *data; + /* for 0 stride we are kinda screwed */ + data = glMapBufferRange(GL_ARRAY_BUFFER, ctx->sub->vbo[vbo_index].buffer_offset, ve->nr_chan * sizeof(GLfloat), GL_MAP_READ_BIT); + + switch (ve->nr_chan) { + case 1: + glVertexAttrib1fv(loc, data); + break; + case 2: + glVertexAttrib2fv(loc, data); + break; + case 3: + glVertexAttrib3fv(loc, data); + break; + case 4: + default: + glVertexAttrib4fv(loc, data); + break; + } + glUnmapBuffer(GL_ARRAY_BUFFER); + disable_bitmask |= (1 << loc); + } else { + enable_bitmask |= (1 << loc); + if (util_format_is_pure_integer(ve->base.src_format)) { + glVertexAttribIPointer(loc, ve->nr_chan, ve->type, ctx->sub->vbo[vbo_index].stride, (void *)(unsigned long)(ve->base.src_offset + ctx->sub->vbo[vbo_index].buffer_offset)); + } else { + glVertexAttribPointer(loc, ve->nr_chan, ve->type, ve->norm, ctx->sub->vbo[vbo_index].stride, (void *)(unsigned long)(ve->base.src_offset + ctx->sub->vbo[vbo_index].buffer_offset)); + } + glVertexAttribDivisorARB(loc, ve->base.instance_divisor); + } + } + if (ctx->sub->enabled_attribs_bitmask != enable_bitmask) { + uint32_t mask = ctx->sub->enabled_attribs_bitmask & disable_bitmask; + + while (mask) { + i = u_bit_scan(&mask); + glDisableVertexAttribArray(i); + } + ctx->sub->enabled_attribs_bitmask &= ~disable_bitmask; + + mask = ctx->sub->enabled_attribs_bitmask ^ enable_bitmask; + while (mask) { + i = u_bit_scan(&mask); + glEnableVertexAttribArray(i); + } + + ctx->sub->enabled_attribs_bitmask = enable_bitmask; + } +} + void vrend_draw_vbo(struct vrend_context *ctx, const struct pipe_draw_info *info, uint32_t cso) @@ -2221,9 +2326,6 @@ void vrend_draw_vbo(struct vrend_context *ctx, int ubo_id; bool new_program = FALSE; uint32_t shader_type; - uint32_t num_enable; - uint32_t enable_bitmask; - uint32_t disable_bitmask; if (ctx->in_error) return; @@ -2391,107 +2493,14 @@ void vrend_draw_vbo(struct vrend_context *ctx, glBindTexture(GL_TEXTURE_2D, ctx->pstipple_tex_id); glUniform1i(ctx->sub->prog->fs_stipple_loc, sampler_id); } - num_enable = ctx->sub->ve->count; - enable_bitmask = 0; - disable_bitmask = ~((1ull << num_enable) - 1); - for (i = 0; i < ctx->sub->ve->count; i++) { - struct vrend_vertex_element *ve = &ctx->sub->ve->elements[i]; - int vbo_index = ctx->sub->ve->elements[i].base.vertex_buffer_index; - struct vrend_buffer *buf; - GLint loc; - - if (i >= ctx->sub->prog->ss[PIPE_SHADER_VERTEX]->sel->sinfo.num_inputs) { - /* XYZZY: debug this? */ - num_enable = ctx->sub->prog->ss[PIPE_SHADER_VERTEX]->sel->sinfo.num_inputs; - break; - } - buf = (struct vrend_buffer *)ctx->sub->vbo[vbo_index].buffer; - - if (!buf) { - fprintf(stderr,"cannot find vbo buf %d %d %d\n", i, ctx->sub->ve->count, ctx->sub->prog->ss[PIPE_SHADER_VERTEX]->sel->sinfo.num_inputs); - continue; - } - - if (vrend_shader_use_explicit) { - loc = i; - } else { - if (ctx->sub->prog->attrib_locs) { - loc = ctx->sub->prog->attrib_locs[i]; - } else loc = -1; - - if (loc == -1) { - fprintf(stderr,"%s: cannot find loc %d %d %d\n", ctx->debug_name, i, ctx->sub->ve->count, ctx->sub->prog->ss[PIPE_SHADER_VERTEX]->sel->sinfo.num_inputs); - num_enable--; - if (i == 0) { - fprintf(stderr,"%s: shader probably didn't compile - skipping rendering\n", ctx->debug_name); - return; - } - continue; - } - } - - if (ve->type == GL_FALSE) { - fprintf(stderr,"failed to translate vertex type - skipping render\n"); - return; - } - - glBindBuffer(GL_ARRAY_BUFFER, buf->base.id); - - if (ctx->sub->vbo[vbo_index].stride == 0) { - void *data; - /* for 0 stride we are kinda screwed */ - data = glMapBufferRange(GL_ARRAY_BUFFER, ctx->sub->vbo[vbo_index].buffer_offset, ve->nr_chan * sizeof(GLfloat), GL_MAP_READ_BIT); - - switch (ve->nr_chan) { - case 1: - glVertexAttrib1fv(loc, data); - break; - case 2: - glVertexAttrib2fv(loc, data); - break; - case 3: - glVertexAttrib3fv(loc, data); - break; - case 4: - default: - glVertexAttrib4fv(loc, data); - break; - } - glUnmapBuffer(GL_ARRAY_BUFFER); - disable_bitmask |= (1 << loc); - } else { - enable_bitmask |= (1 << loc); - if (util_format_is_pure_integer(ve->base.src_format)) { - glVertexAttribIPointer(loc, ve->nr_chan, ve->type, ctx->sub->vbo[vbo_index].stride, (void *)(unsigned long)(ve->base.src_offset + ctx->sub->vbo[vbo_index].buffer_offset)); - } else { - glVertexAttribPointer(loc, ve->nr_chan, ve->type, ve->norm, ctx->sub->vbo[vbo_index].stride, (void *)(unsigned long)(ve->base.src_offset + ctx->sub->vbo[vbo_index].buffer_offset)); - } - glVertexAttribDivisorARB(loc, ve->base.instance_divisor); - } - } if (ctx->sub->rs_state.clip_plane_enable) { for (i = 0 ; i < 8; i++) { glUniform4fv(ctx->sub->prog->clip_locs[i], 1, (const GLfloat *)&ctx->sub->ucp_state.ucp[i]); } } - if (ctx->sub->enabled_attribs_bitmask != enable_bitmask) { - uint32_t mask = ctx->sub->enabled_attribs_bitmask & disable_bitmask; - while (mask) { - i = u_bit_scan(&mask); - glDisableVertexAttribArray(i); - } - ctx->sub->enabled_attribs_bitmask &= ~disable_bitmask; - - mask = ctx->sub->enabled_attribs_bitmask ^ enable_bitmask; - while (mask) { - i = u_bit_scan(&mask); - glEnableVertexAttribArray(i); - } - - ctx->sub->enabled_attribs_bitmask = enable_bitmask; - } + vrend_draw_bind_vertex_legacy(ctx, ctx->sub->ve); if (info->indexed) { struct vrend_resource *res = (struct vrend_resource *)ctx->sub->ib.buffer; |