[Mesa-dev] [PATCH 1/4] gallium: add fragment shader property for color writes to all buffers.
Keith Whitwell
keithw at vmware.com
Thu Dec 23 07:43:09 PST 2010
Dave,
This all looks good to me (modulo the glitch Tilman pointed out).
Keith
On Thu, 2010-12-23 at 00:43 -0800, Dave Airlie wrote:
> For GL fragColor semantics we need to tell the pipe drivers that the fragment
> shader color result is to be replicated to all bound color buffers, this
> adds the basic TGSI + documentation.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
> src/gallium/auxiliary/tgsi/tgsi_text.c | 3 +++
> src/gallium/auxiliary/tgsi/tgsi_ureg.c | 16 +++++++++++++++-
> src/gallium/auxiliary/tgsi/tgsi_ureg.h | 4 ++++
> src/gallium/docs/source/tgsi.rst | 5 +++++
> src/gallium/include/pipe/p_shader_tokens.h | 3 ++-
> 5 files changed, 29 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c b/src/gallium/auxiliary/tgsi/tgsi_text.c
> index 9a38c37..d868b5b 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_text.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_text.c
> @@ -1265,6 +1265,7 @@ static const char *property_names[] =
> "GS_MAX_OUTPUT_VERTICES",
> "FS_COORD_ORIGIN",
> "FS_COORD_PIXEL_CENTER"
> + "FS_COLOR0_WRITE_ALL_CBUFS"
> };
>
> static const char *primitive_names[] =
> @@ -1398,6 +1399,8 @@ static boolean parse_property( struct translate_ctx *ctx )
> return FALSE;
> }
> break;
> + case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS:
> + break;
> default:
> if (!parse_uint(&ctx->cur, &values[0] )) {
> report_error( ctx, "Expected unsigned integer as property!" );
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> index 7d13a17..02de12d 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> @@ -148,6 +148,7 @@ struct ureg_program
> unsigned property_gs_max_vertices;
> unsigned char property_fs_coord_origin; /* = TGSI_FS_COORD_ORIGIN_* */
> unsigned char property_fs_coord_pixel_center; /* = TGSI_FS_COORD_PIXEL_CENTER_* */
> + unsigned char property_fs_color0_writes_all_cbufs; /* = TGSI_FS_COLOR0_WRITES_ALL_CBUFS * */
>
> unsigned nr_addrs;
> unsigned nr_preds;
> @@ -284,7 +285,12 @@ ureg_property_fs_coord_pixel_center(struct ureg_program *ureg,
> ureg->property_fs_coord_pixel_center = fs_coord_pixel_center;
> }
>
> -
> +void
> +ureg_property_fs_color0_writes_all_cbufs(struct ureg_program *ureg,
> + unsigned fs_color0_writes_all_cbufs)
> +{
> + ureg->property_fs_color0_writes_all_cbufs = fs_color0_writes_all_cbufs;
> +}
>
> struct ureg_src
> ureg_DECL_fs_input_cyl_centroid(struct ureg_program *ureg,
> @@ -1278,6 +1284,14 @@ static void emit_decls( struct ureg_program *ureg )
> ureg->property_fs_coord_pixel_center);
> }
>
> + if (ureg->property_fs_color0_writes_all_cbufs) {
> + assert(ureg->processor == TGSI_PROCESSOR_FRAGMENT);
> +
> + emit_property(ureg,
> + TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS,
> + ureg->property_fs_color0_writes_all_cbufs);
> + }
> +
> if (ureg->processor == TGSI_PROCESSOR_VERTEX) {
> for (i = 0; i < UREG_MAX_INPUT; i++) {
> if (ureg->vs_inputs[i/32] & (1 << (i%32))) {
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> index acc4632..807128a 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> @@ -153,6 +153,10 @@ void
> ureg_property_fs_coord_pixel_center(struct ureg_program *ureg,
> unsigned fs_coord_pixel_center);
>
> +void
> +ureg_property_fs_color0_writes_all_cbufs(struct ureg_program *ureg,
> + unsigned fs_color0_writes_all_cbufs);
> +
> /***********************************************************************
> * Build shader declarations:
> */
> diff --git a/src/gallium/docs/source/tgsi.rst b/src/gallium/docs/source/tgsi.rst
> index 7eb6bd0..d986e66 100644
> --- a/src/gallium/docs/source/tgsi.rst
> +++ b/src/gallium/docs/source/tgsi.rst
> @@ -1516,6 +1516,11 @@ GL_ARB_fragment_coord_conventions extension.
> DirectX 9 uses INTEGER.
> DirectX 10 uses HALF_INTEGER.
>
> +FS_COLOR0_WRITES_ALL_CBUFS
> +""""""""""""""""""""""""""
> +Specifies that writes to the fragment shader color 0 are replicated to all
> +bound cbufs. This facilitates OpenGL's fragColor output vs fragData[0] where
> +fragData is directed to a single color buffer, but fragColor is broadcast.
>
>
> Texture Sampling and Texture Formats
> diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h
> index ba433b2..0a9e141 100644
> --- a/src/gallium/include/pipe/p_shader_tokens.h
> +++ b/src/gallium/include/pipe/p_shader_tokens.h
> @@ -177,7 +177,8 @@ union tgsi_immediate_data
> #define TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES 2
> #define TGSI_PROPERTY_FS_COORD_ORIGIN 3
> #define TGSI_PROPERTY_FS_COORD_PIXEL_CENTER 4
> -#define TGSI_PROPERTY_COUNT 5
> +#define TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS 5
> +#define TGSI_PROPERTY_COUNT 6
>
> struct tgsi_property {
> unsigned Type : 4; /**< TGSI_TOKEN_TYPE_PROPERTY */
More information about the mesa-dev
mailing list