diff options
author | Zack Rusin <zackr@vmware.com> | 2009-08-26 12:50:14 -0400 |
---|---|---|
committer | Zack Rusin <zackr@vmware.com> | 2009-08-26 12:50:47 -0400 |
commit | a0966c41a913666f0a6b04bde63162a30b1a1879 (patch) | |
tree | f4a2ad459fd3dcb7d8dee7154bd77483c68fb7aa | |
parent | b324aacf139bc88fa268057158af88f725c50c63 (diff) |
st/xorg: create basic vertex shader
-rw-r--r-- | src/gallium/state_trackers/xorg/xorg_exa_tgsi.c | 40 | ||||
-rw-r--r-- | src/gallium/state_trackers/xorg/xorg_exa_tgsi.h | 5 |
2 files changed, 37 insertions, 8 deletions
diff --git a/src/gallium/state_trackers/xorg/xorg_exa_tgsi.c b/src/gallium/state_trackers/xorg/xorg_exa_tgsi.c index b428957abf..04d8977a4c 100644 --- a/src/gallium/state_trackers/xorg/xorg_exa_tgsi.c +++ b/src/gallium/state_trackers/xorg/xorg_exa_tgsi.c @@ -57,10 +57,33 @@ src_in_mask(struct ureg_program *ureg, } static void * -create_vs(struct pipe_context *ctx, +create_vs(struct pipe_context *pipe, unsigned vs_traits) { - return NULL; + struct ureg_program *ureg; + struct ureg_src src; + struct ureg_dst dst; + + ureg = ureg_create(TGSI_PROCESSOR_VERTEX); + if (ureg == NULL) + return 0; + + if ((vs_traits & VS_COMPOSITE)) { + src = ureg_DECL_vs_input(ureg, + TGSI_SEMANTIC_POSITION, 1); + dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 1); + ureg_MOV(ureg, dst, src); + } + if ((vs_traits & VS_MASK)) { + src = ureg_DECL_vs_input(ureg, + TGSI_SEMANTIC_POSITION, 2); + dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 2); + ureg_MOV(ureg, dst, src); + } + + ureg_END(ureg); + + return ureg_create_shader_and_destroy(ureg, pipe); } static void * @@ -71,6 +94,7 @@ create_fs(struct pipe_context *pipe, struct ureg_src dst_sampler, src_sampler, mask_sampler; struct ureg_src dst_pos, src_pos, mask_pos; struct ureg_src src, mask; + struct ureg_dst out; ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT); if (ureg == NULL) @@ -90,6 +114,10 @@ create_fs(struct pipe_context *pipe, 1, TGSI_INTERPOLATE_PERSPECTIVE); + out = ureg_DECL_output(ureg, + TGSI_SEMANTIC_COLOR, + 0); + if ((fs_traits & FS_MASK)) { mask_sampler = ureg_DECL_sampler(ureg); mask_pos = ureg_DECL_fs_input(ureg, @@ -98,14 +126,14 @@ create_fs(struct pipe_context *pipe, TGSI_INTERPOLATE_PERSPECTIVE); } - ureg_TEX(ureg, ureg_dst(src), - TGSI_TEXTURE_2D, src_pos, src_sampler); - if ((fs_traits & FS_MASK)) { ureg_TEX(ureg, ureg_dst(mask), TGSI_TEXTURE_2D, mask_pos, mask_sampler); /* src IN mask */ - src_in_mask(ureg, ureg_dst(src), src, mask); + src_in_mask(ureg, out, src, mask); + } else { + ureg_TEX(ureg, out, + TGSI_TEXTURE_2D, src_pos, src_sampler); } ureg_END(ureg); diff --git a/src/gallium/state_trackers/xorg/xorg_exa_tgsi.h b/src/gallium/state_trackers/xorg/xorg_exa_tgsi.h index f87f035267..003e5d8caf 100644 --- a/src/gallium/state_trackers/xorg/xorg_exa_tgsi.h +++ b/src/gallium/state_trackers/xorg/xorg_exa_tgsi.h @@ -5,8 +5,9 @@ enum xorg_vs_traits { VS_COMPOSITE = 1 << 0, - VS_FILL = 1 << 1 - /*VS_TRANSFORM = 1 << 2*/ + VS_MASK = 1 << 1, + VS_FILL = 1 << 2 + /*VS_TRANSFORM = 1 << 3*/ }; enum xorg_fs_traits { |