const struct tgsi_token *tokens;
struct ureg_src src;
struct ureg_dst dst;
- unsigned num_tokens;
- ureg = ureg_create(TGSI_PROCESSOR_VERTEX);
+ ureg = ureg_create(PIPE_SHADER_VERTEX);
if (!ureg)
return NULL;
ureg_MOV(ureg, dst, src);
ureg_END(ureg);
- tokens = ureg_get_tokens(ureg, &num_tokens);
+ tokens = ureg_get_tokens(ureg, NULL);
ureg_destroy(ureg);
PIPE_SHADER_VERTEX);
}
else {
- return svga_tgsi_vgpu9_translate(&vs->base, key, PIPE_SHADER_VERTEX);
+ return svga_tgsi_vgpu9_translate(svga, &vs->base, key,
+ PIPE_SHADER_VERTEX);
}
}
debug_printf("Failed to compile vertex shader,"
" using dummy shader instead.\n");
variant = get_compiled_dummy_vertex_shader(svga, vs, key);
- if (!variant) {
- ret = PIPE_ERROR;
- goto fail;
- }
}
-
- if (svga_shader_too_large(svga, variant)) {
+ else if (svga_shader_too_large(svga, variant)) {
/* too big, use dummy shader */
debug_printf("Shader too large (%u bytes),"
" using dummy shader instead.\n",
(unsigned) (variant->nr_tokens
* sizeof(variant->tokens[0])));
+ /* Free the too-large variant */
+ svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_VS, variant);
+ /* Use simple pass-through shader instead */
variant = get_compiled_dummy_vertex_shader(svga, vs, key);
- if (!variant) {
- ret = PIPE_ERROR;
- goto fail;
- }
+ }
+
+ if (!variant) {
+ return PIPE_ERROR;
}
ret = svga_define_shader(svga, SVGA3D_SHADERTYPE_VS, variant);
- if (ret != PIPE_OK)
- goto fail;
+ if (ret != PIPE_OK) {
+ svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_VS, variant);
+ return ret;
+ }
*out_variant = variant;
return PIPE_OK;
-
-fail:
- if (variant) {
- svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_VS, variant);
- }
- return ret;
}
+
/* SVGA_NEW_PRESCALE, SVGA_NEW_RAST, SVGA_NEW_FS
*/
static void
make_vs_key(struct svga_context *svga, struct svga_compile_key *key)
{
- const unsigned shader = PIPE_SHADER_VERTEX;
+ const enum pipe_shader_type shader = PIPE_SHADER_VERTEX;
memset(key, 0, sizeof *key);
return;
}
+ /* SVGA_NEW_PRESCALE */
key->vs.need_prescale = svga->state.hw_clear.prescale.enabled &&
(svga->curr.gs == NULL);
+
+ /* SVGA_NEW_RAST */
key->vs.allow_psiz = svga->curr.rast->templ.point_size_per_vertex;
/* SVGA_NEW_FS */
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;
num_inputs = fs->base.info.num_inputs;
- ureg = ureg_create(TGSI_PROCESSOR_VERTEX);
+ ureg = ureg_create(PIPE_SHADER_VERTEX);
if (!ureg)
return PIPE_ERROR_OUT_OF_MEMORY;
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));
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
*/
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);
if (variant) {
ret = svga_set_shader(svga, SVGA3D_SHADERTYPE_VS, variant);
if (ret != PIPE_OK)
- return ret;
+ goto done;
svga->rebind.flags.vs = FALSE;
}
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 =