X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fsvga%2Fsvga_state_vs.c;h=492a929bd8f1fab8a33ddb5d608a8f432fc19dc7;hb=9b75061386ea52bcd1041fb7840e0121d5a883c5;hp=f46e6b3d4da6e9a838fd0010853afc429ebf53fc;hpb=af249a7da9bf2621ab836d5074ef692677b11bbf;p=mesa.git diff --git a/src/gallium/drivers/svga/svga_state_vs.c b/src/gallium/drivers/svga/svga_state_vs.c index f46e6b3d4da..492a929bd8f 100644 --- a/src/gallium/drivers/svga/svga_state_vs.c +++ b/src/gallium/drivers/svga/svga_state_vs.c @@ -52,7 +52,6 @@ get_dummy_vertex_shader(void) const struct tgsi_token *tokens; struct ureg_src src; struct ureg_dst dst; - unsigned num_tokens; ureg = ureg_create(PIPE_SHADER_VERTEX); if (!ureg) @@ -63,7 +62,7 @@ get_dummy_vertex_shader(void) ureg_MOV(ureg, dst, src); ureg_END(ureg); - tokens = ureg_get_tokens(ureg, &num_tokens); + tokens = ureg_get_tokens(ureg, NULL); ureg_destroy(ureg); @@ -106,6 +105,9 @@ get_compiled_dummy_vertex_shader(struct svga_context *svga, FREE((void *) vs->base.tokens); vs->base.tokens = dummy; + tgsi_scan_shader(vs->base.tokens, &vs->base.info); + vs->generic_outputs = svga_get_generic_outputs_mask(&vs->base.info); + variant = translate_vertex_program(svga, vs, key); return variant; } @@ -136,7 +138,7 @@ compile_vs(struct svga_context *svga, (unsigned) (variant->nr_tokens * sizeof(variant->tokens[0]))); /* Free the too-large variant */ - svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_VS, variant); + svga_destroy_shader_variant(svga, variant); /* Use simple pass-through shader instead */ variant = get_compiled_dummy_vertex_shader(svga, vs, key); } @@ -145,9 +147,9 @@ compile_vs(struct svga_context *svga, return PIPE_ERROR; } - ret = svga_define_shader(svga, SVGA3D_SHADERTYPE_VS, variant); + ret = svga_define_shader(svga, variant); if (ret != PIPE_OK) { - svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_VS, variant); + svga_destroy_shader_variant(svga, variant); return ret; } @@ -162,7 +164,7 @@ compile_vs(struct svga_context *svga, static void make_vs_key(struct svga_context *svga, struct svga_compile_key *key) { - const unsigned shader = PIPE_SHADER_VERTEX; + struct svga_vertex_shader *vs = svga->curr.vs; memset(key, 0, sizeof *key); @@ -173,8 +175,13 @@ make_vs_key(struct svga_context *svga, struct svga_compile_key *key) return; } + if (svga_have_vgpu10(svga)) { + key->vs.need_vertex_id_bias = 1; + } + /* SVGA_NEW_PRESCALE */ - key->vs.need_prescale = svga->state.hw_clear.prescale.enabled && + key->vs.need_prescale = svga->state.hw_clear.prescale[0].enabled && + (svga->curr.tes == NULL) && (svga->curr.gs == NULL); /* SVGA_NEW_RAST */ @@ -197,10 +204,16 @@ make_vs_key(struct svga_context *svga, struct svga_compile_key *key) key->vs.attrib_puint_to_sscaled = svga->curr.velems->attrib_puint_to_sscaled; /* SVGA_NEW_TEXTURE_BINDING | SVGA_NEW_SAMPLER */ - svga_init_shader_key_common(svga, shader, key); + svga_init_shader_key_common(svga, PIPE_SHADER_VERTEX, &vs->base, key); /* SVGA_NEW_RAST */ key->clip_plane_enable = svga->curr.rast->templ.clip_plane_enable; + + /* Determine if this shader is the last shader in the vertex + * processing stage. + */ + key->last_vertex_stage = !(svga->curr.gs || + svga->curr.tcs || svga->curr.tes); } @@ -225,16 +238,15 @@ svga_reemit_vs_bindings(struct svga_context *svga) if (!svga_need_to_rebind_resources(svga)) { ret = svga->swc->resource_rebind(svga->swc, NULL, gbshader, SVGA_RELOC_READ); - goto out; + } + else { + if (svga_have_vgpu10(svga)) + ret = SVGA3D_vgpu10_SetShader(svga->swc, SVGA3D_SHADERTYPE_VS, + gbshader, shaderId); + else + ret = SVGA3D_SetGBShader(svga->swc, SVGA3D_SHADERTYPE_VS, gbshader); } - if (svga_have_vgpu10(svga)) - ret = SVGA3D_vgpu10_SetShader(svga->swc, SVGA3D_SHADERTYPE_VS, - gbshader, shaderId); - else - ret = SVGA3D_SetGBShader(svga->swc, SVGA3D_SHADERTYPE_VS, gbshader); - - out: if (ret != PIPE_OK) return ret; @@ -264,7 +276,6 @@ compile_passthrough_vs(struct svga_context *svga, struct ureg_src src[PIPE_MAX_SHADER_INPUTS]; struct ureg_dst dst[PIPE_MAX_SHADER_OUTPUTS]; struct ureg_program *ureg; - unsigned num_tokens; struct svga_compile_key key; enum pipe_error ret; @@ -313,7 +324,7 @@ compile_passthrough_vs(struct svga_context *svga, ureg_END(ureg); memset(&new_vs, 0, sizeof(new_vs)); - new_vs.base.tokens = ureg_get_tokens(ureg, &num_tokens); + new_vs.base.tokens = ureg_get_tokens(ureg, NULL); tgsi_scan_shader(new_vs.base.tokens, &new_vs.base.info); memset(&key, 0, sizeof(key)); @@ -338,7 +349,7 @@ compile_passthrough_vs(struct svga_context *svga, static enum pipe_error -emit_hw_vs(struct svga_context *svga, unsigned dirty) +emit_hw_vs(struct svga_context *svga, uint64_t dirty) { struct svga_shader_variant *variant; struct svga_vertex_shader *vs = svga->curr.vs; @@ -346,6 +357,8 @@ emit_hw_vs(struct svga_context *svga, unsigned dirty) enum pipe_error ret = PIPE_OK; struct svga_compile_key key; + SVGA_STATS_TIME_PUSH(svga_sws(svga), SVGA_STATS_TIME_EMITVS); + /* If there is an active geometry shader, and it has stream output * defined, then we will skip the stream output from the vertex shader */ @@ -353,11 +366,14 @@ emit_hw_vs(struct svga_context *svga, unsigned dirty) /* No GS stream out */ if (svga_have_vs_streamout(svga)) { /* Set VS stream out */ - svga_set_stream_output(svga, vs->base.stream_output); + ret = svga_set_stream_output(svga, vs->base.stream_output); } else { /* turn off stream out */ - svga_set_stream_output(svga, NULL); + ret = svga_set_stream_output(svga, NULL); + } + if (ret != PIPE_OK) { + goto done; } } @@ -381,7 +397,7 @@ emit_hw_vs(struct svga_context *svga, unsigned dirty) ret = compile_vs(svga, vs, &key, &variant); } if (ret != PIPE_OK) - return ret; + goto done; /* insert the new variant at head of linked list */ assert(variant); @@ -395,7 +411,7 @@ emit_hw_vs(struct svga_context *svga, unsigned dirty) if (variant) { ret = svga_set_shader(svga, SVGA3D_SHADERTYPE_VS, variant); if (ret != PIPE_OK) - return ret; + goto done; svga->rebind.flags.vs = FALSE; } @@ -403,7 +419,9 @@ emit_hw_vs(struct svga_context *svga, unsigned dirty) svga->state.hw_draw.vs = variant; } - return PIPE_OK; +done: + SVGA_STATS_TIME_POP(svga_sws(svga)); + return ret; } struct svga_tracked_state svga_hw_vs =