#include "util/u_inlines.h"
#include "pipe/p_defines.h"
+#include "util/u_format.h"
#include "util/u_math.h"
#include "util/u_memory.h"
#include "util/u_bitmask.h"
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);
FREE((void *) fs->base.tokens);
fs->base.tokens = dummy;
+ tgsi_scan_shader(fs->base.tokens, &fs->base.info);
+ fs->generic_inputs = svga_get_generic_inputs_mask(&fs->base.info);
+ svga_remap_generics(fs->generic_inputs, fs->generic_remap_table);
+
variant = translate_fragment_program(svga, fs, key);
return variant;
}
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);
*
* SVGA_NEW_BLEND
*/
- if (svga->curr.blend->need_white_fragments) {
- key->fs.white_fragments = 1;
- }
+ key->fs.white_fragments = svga->curr.blend->need_white_fragments;
+
+ key->fs.alpha_to_one = svga->curr.blend->alpha_to_one;
#ifdef DEBUG
/*
}
/* sprite coord gen state */
- for (i = 0; i < svga->curr.num_samplers[shader]; ++i) {
- key->tex[i].sprite_texgen =
- svga->curr.rast->templ.sprite_coord_enable & (1 << i);
- }
+ key->sprite_coord_enable = svga->curr.rast->templ.sprite_coord_enable;
key->sprite_origin_lower_left = (svga->curr.rast->templ.sprite_coord_mode
== PIPE_SPRITE_COORD_LOWER_LEFT);
}
}
- /* SVGA_NEW_FRAME_BUFFER */
- if (fs->base.info.properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS]) {
- /* Replicate color0 output to N colorbuffers */
+ /* SVGA_NEW_FRAME_BUFFER | SVGA_NEW_BLEND */
+ if (fs->base.info.properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS] ||
+ svga->curr.blend->need_white_fragments) {
+ /* Replicate color0 output (or white) to N colorbuffers */
key->fs.write_color0_to_n_cbufs = svga->curr.framebuffer.nr_cbufs;
}
ret = svga->swc->resource_rebind(svga->swc, NULL,
svga->state.hw_draw.fs->gb_shader,
SVGA_RELOC_READ);
- goto out;
+ }
+ else {
+ if (svga_have_vgpu10(svga))
+ ret = SVGA3D_vgpu10_SetShader(svga->swc, SVGA3D_SHADERTYPE_PS,
+ svga->state.hw_draw.fs->gb_shader,
+ svga->state.hw_draw.fs->id);
+ else
+ ret = SVGA3D_SetGBShader(svga->swc, SVGA3D_SHADERTYPE_PS,
+ svga->state.hw_draw.fs->gb_shader);
}
- if (svga_have_vgpu10(svga))
- ret = SVGA3D_vgpu10_SetShader(svga->swc, SVGA3D_SHADERTYPE_PS,
- svga->state.hw_draw.fs->gb_shader,
- svga->state.hw_draw.fs->id);
- else
- ret = SVGA3D_SetGBShader(svga->swc, SVGA3D_SHADERTYPE_PS,
- svga->state.hw_draw.fs->gb_shader);
-
- out:
if (ret != PIPE_OK)
return ret;
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 =