const struct tgsi_token *tokens;
struct ureg_src src;
struct ureg_dst dst;
- unsigned num_tokens;
- ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT);
+ ureg = ureg_create(PIPE_SHADER_FRAGMENT);
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);
struct svga_fragment_shader *fs,
struct svga_compile_key *key)
{
- const unsigned shader = PIPE_SHADER_FRAGMENT;
+ const enum pipe_shader_type shader = PIPE_SHADER_FRAGMENT;
unsigned i;
memset(key, 0, sizeof *key);
struct svga_fragment_shader *fs = svga->curr.fs;
struct svga_compile_key key;
+ SVGA_STATS_TIME_PUSH(svga_sws(svga), SVGA_STATS_TIME_EMITFS);
+
+ /* Disable rasterization if rasterizer_discard flag is set or
+ * vs/gs does not output position.
+ */
+ svga->disable_rasterizer =
+ svga->curr.rast->templ.rasterizer_discard ||
+ (svga->curr.gs && !svga->curr.gs->base.info.writes_position) ||
+ (!svga->curr.gs && !svga->curr.vs->base.info.writes_position);
+
+ /* Set FS to NULL when rasterization is to be disabled */
+ if (svga->disable_rasterizer) {
+ /* Set FS to NULL if it has not been done */
+ if (svga->state.hw_draw.fs) {
+ ret = svga_set_shader(svga, SVGA3D_SHADERTYPE_PS, NULL);
+ if (ret != PIPE_OK)
+ goto done;
+ }
+ svga->rebind.flags.fs = FALSE;
+ svga->state.hw_draw.fs = NULL;
+ goto done;
+ }
+
/* SVGA_NEW_BLEND
* SVGA_NEW_TEXTURE_BINDING
* SVGA_NEW_RAST
*/
ret = make_fs_key(svga, fs, &key);
if (ret != PIPE_OK)
- return ret;
+ goto done;
variant = svga_search_shader_key(&fs->base, &key);
if (!variant) {
ret = compile_fs(svga, fs, &key, &variant);
if (ret != PIPE_OK)
- return ret;
+ goto done;
}
assert(variant);
if (variant != svga->state.hw_draw.fs) {
ret = svga_set_shader(svga, SVGA3D_SHADERTYPE_PS, variant);
if (ret != PIPE_OK)
- return ret;
+ goto done;
svga->rebind.flags.fs = FALSE;
svga->state.hw_draw.fs = variant;
}
- return PIPE_OK;
+done:
+ SVGA_STATS_TIME_POP(svga_sws(svga));
+ return ret;
}
struct svga_tracked_state svga_hw_fs =