You can pull from http://repo.or.cz/w/mesa/mesa-lb.git/shortlog/refs/heads/arb_fragment_coord_conventions and http://repo.or.cz/w/mesa/mesa-lb.git/shortlog/refs/heads/arb_half_float_vertex
On Fri, Jan 29, 2010 at 1:14 PM, Keith Whitwell <kei...@vmware.com> wrote: > Looks great. > > Applying patches from this webmail client is a total pain... Let me look > figure out an alternative. > > Keith > ________________________________________ > From: Luca Barbieri [l...@luca-barbieri.com] > Sent: Thursday, January 28, 2010 10:18 PM > To: Brian Paul > Cc: Luca Barbieri; mesa3d-dev@lists.sourceforge.net > Subject: [Mesa3d-dev] [PATCH 2/5] tgsi: add properties for fragment coord > conventions (v3) > > Changes in v3: > - Documented the new properties > - Added comments for property values > - Rebased to current master > > Changes in v2: > - Caps are added in a separate, subsequent patch > > This adds two TGSI fragment program properties that indicate the > fragment coord conventions. > > The properties behave as described in the extension spec for > GL_ARB_fragment_coord_conventions, but the default origin in > upper left instead of lower left as in OpenGL. > > The syntax is: > PROPERTY FS_COORD_ORIGIN [UPPER_LEFT|LOWER_LEFT] > PROPERTY FS_COORD_PIXEL_CENTER [HALF_INTEGER|INTEGER] > > The names have been chosen for consistency with the GS properties > and the OpenGL extension spec. > > The defaults are of course the previously assumed conventions: > UPPER_LEFT and HALF_INTEGER. > --- > src/gallium/auxiliary/tgsi/tgsi_dump.c | 22 +++++++++- > src/gallium/auxiliary/tgsi/tgsi_text.c | 63 > +++++++++++++++++++++++++++- > src/gallium/auxiliary/tgsi/tgsi_ureg.c | 32 ++++++++++++++ > src/gallium/auxiliary/tgsi/tgsi_ureg.h | 7 +++ > src/gallium/docs/source/tgsi.rst | 47 +++++++++++++++++++- > src/gallium/include/pipe/p_shader_tokens.h | 10 ++++- > 6 files changed, 175 insertions(+), 6 deletions(-) > > diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c > b/src/gallium/auxiliary/tgsi/tgsi_dump.c > index 5472466..dd36555 100644 > --- a/src/gallium/auxiliary/tgsi/tgsi_dump.c > +++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c > @@ -159,7 +159,9 @@ static const char *property_names[] = > { > "GS_INPUT_PRIMITIVE", > "GS_OUTPUT_PRIMITIVE", > - "GS_MAX_OUTPUT_VERTICES" > + "GS_MAX_OUTPUT_VERTICES", > + "FS_COORD_ORIGIN", > + "FS_COORD_PIXEL_CENTER" > }; > > static const char *primitive_names[] = > @@ -176,6 +178,18 @@ static const char *primitive_names[] = > "POLYGON" > }; > > +static const char *fs_coord_origin_names[] = > +{ > + "UPPER_LEFT", > + "LOWER_LEFT" > +}; > + > +static const char *fs_coord_pixel_center_names[] = > +{ > + "HALF_INTEGER", > + "INTEGER" > +}; > + > > static void > _dump_register_dst( > @@ -366,6 +380,12 @@ iter_property( > case TGSI_PROPERTY_GS_OUTPUT_PRIM: > ENM(prop->u[i].Data, primitive_names); > break; > + case TGSI_PROPERTY_FS_COORD_ORIGIN: > + ENM(prop->u[i].Data, fs_coord_origin_names); > + break; > + case TGSI_PROPERTY_FS_COORD_PIXEL_CENTER: > + ENM(prop->u[i].Data, fs_coord_pixel_center_names); > + break; > default: > SID( prop->u[i].Data ); > break; > diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c > b/src/gallium/auxiliary/tgsi/tgsi_text.c > index f74b56b..96be353 100644 > --- a/src/gallium/auxiliary/tgsi/tgsi_text.c > +++ b/src/gallium/auxiliary/tgsi/tgsi_text.c > @@ -1129,7 +1129,9 @@ static const char *property_names[] = > { > "GS_INPUT_PRIMITIVE", > "GS_OUTPUT_PRIMITIVE", > - "GS_MAX_OUTPUT_VERTICES" > + "GS_MAX_OUTPUT_VERTICES", > + "FS_COORD_ORIGIN", > + "FS_COORD_PIXEL_CENTER" > }; > > static const char *primitive_names[] = > @@ -1146,6 +1148,19 @@ static const char *primitive_names[] = > "POLYGON" > }; > > +static const char *fs_coord_origin_names[] = > +{ > + "UPPER_LEFT", > + "LOWER_LEFT" > +}; > + > +static const char *fs_coord_pixel_center_names[] = > +{ > + "HALF_INTEGER", > + "INTEGER" > +}; > + > + > static boolean > parse_primitive( const char **pcur, uint *primitive ) > { > @@ -1163,6 +1178,40 @@ parse_primitive( const char **pcur, uint *primitive ) > return FALSE; > } > > +static boolean > +parse_fs_coord_origin( const char **pcur, uint *fs_coord_origin ) > +{ > + uint i; > + > + for (i = 0; i < sizeof(fs_coord_origin_names) / > sizeof(fs_coord_origin_names[0]); i++) { > + const char *cur = *pcur; > + > + if (str_match_no_case( &cur, fs_coord_origin_names[i])) { > + *fs_coord_origin = i; > + *pcur = cur; > + return TRUE; > + } > + } > + return FALSE; > +} > + > +static boolean > +parse_fs_coord_pixel_center( const char **pcur, uint *fs_coord_pixel_center ) > +{ > + uint i; > + > + for (i = 0; i < sizeof(fs_coord_pixel_center_names) / > sizeof(fs_coord_pixel_center_names[0]); i++) { > + const char *cur = *pcur; > + > + if (str_match_no_case( &cur, fs_coord_pixel_center_names[i])) { > + *fs_coord_pixel_center = i; > + *pcur = cur; > + return TRUE; > + } > + } > + return FALSE; > +} > + > > static boolean parse_property( struct translate_ctx *ctx ) > { > @@ -1204,6 +1253,18 @@ static boolean parse_property( struct translate_ctx > *ctx ) > ctx->implied_array_size = u_vertices_per_prim(values[0]); > } > break; > + case TGSI_PROPERTY_FS_COORD_ORIGIN: > + if (!parse_fs_coord_origin(&ctx->cur, &values[0] )) { > + report_error( ctx, "Unknown coord origin as property: must be > UPPER_LEFT or LOWER_LEFT!" ); > + return FALSE; > + } > + break; > + case TGSI_PROPERTY_FS_COORD_PIXEL_CENTER: > + if (!parse_fs_coord_pixel_center(&ctx->cur, &values[0] )) { > + report_error( ctx, "Unknown coord pixel center as property: must be > HALF_INTEGER or INTEGER!" ); > + return FALSE; > + } > + 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 f2610d0..0ae4678 100644 > --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c > +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c > @@ -142,6 +142,8 @@ struct ureg_program > unsigned property_gs_input_prim; > unsigned property_gs_output_prim; > 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 nr_addrs; > unsigned nr_preds; > @@ -265,6 +267,20 @@ ureg_property_gs_max_vertices(struct ureg_program *ureg, > ureg->property_gs_max_vertices = max_vertices; > } > > +void > +ureg_property_fs_coord_origin(struct ureg_program *ureg, > + unsigned fs_coord_origin) > +{ > + ureg->property_fs_coord_origin = fs_coord_origin; > +} > + > +void > +ureg_property_fs_coord_pixel_center(struct ureg_program *ureg, > + unsigned fs_coord_pixel_center) > +{ > + ureg->property_fs_coord_pixel_center = fs_coord_pixel_center; > +} > + > > > struct ureg_src > @@ -1202,6 +1218,22 @@ static void emit_decls( struct ureg_program *ureg ) > ureg->property_gs_max_vertices); > } > > + if (ureg->property_fs_coord_origin) { > + assert(ureg->processor == TGSI_PROCESSOR_FRAGMENT); > + > + emit_property(ureg, > + TGSI_PROPERTY_FS_COORD_ORIGIN, > + ureg->property_fs_coord_origin); > + } > + > + if (ureg->property_fs_coord_pixel_center) { > + assert(ureg->processor == TGSI_PROCESSOR_FRAGMENT); > + > + emit_property(ureg, > + TGSI_PROPERTY_FS_COORD_PIXEL_CENTER, > + ureg->property_fs_coord_pixel_center); > + } > + > 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 2ac00de..e25f35c 100644 > --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h > +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h > @@ -136,6 +136,13 @@ void > ureg_property_gs_max_vertices(struct ureg_program *ureg, > unsigned max_vertices); > > +void > +ureg_property_fs_coord_origin(struct ureg_program *ureg, > + unsigned fs_coord_origin); > + > +void > +ureg_property_fs_coord_pixel_center(struct ureg_program *ureg, > + unsigned fs_coord_pixel_center); > > /*********************************************************************** > * Build shader declarations: > diff --git a/src/gallium/docs/source/tgsi.rst > b/src/gallium/docs/source/tgsi.rst > index 2c34a6b..3e702ce 100644 > --- a/src/gallium/docs/source/tgsi.rst > +++ b/src/gallium/docs/source/tgsi.rst > @@ -1319,9 +1319,8 @@ are the Cartesian coordinates, and ``w`` is the > homogenous coordinate and used > for the perspective divide, if enabled. > > As a vertex shader output, position should be scaled to the viewport. When > -used in fragment shaders, position will --- > - > -XXX --- wait a minute. Should position be in [0,1] for x and y? > +used in fragment shaders, position will be in window coordinates. The > convention > +used depends on the FS_COORD_ORIGIN and FS_COORD_PIXEL_CENTER properties. > > XXX additionally, is there a way to configure the perspective divide? it's > accelerated on most chipsets AFAIK... > @@ -1400,3 +1399,45 @@ TGSI_SEMANTIC_EDGEFLAG > """""""""""""""""""""" > > XXX no clue > + > + > +Properties > +^^^^^^^^^^^^^^^^^^^^^^^^ > + > + > + Properties are general directives that apply to the whole TGSI program. > + > +FS_COORD_ORIGIN > +""""""""""""""" > + > +Specifies the fragment shader TGSI_SEMANTIC_POSITION coordinate origin. > +The default value is UPPER_LEFT. > + > +If UPPER_LEFT, the position will be (0,0) at the upper left corner and > +increase downward and rightward. > +If LOWER_LEFT, the position will be (0,0) at the lower left corner and > +increase upward and rightward. > + > +OpenGL defaults to LOWER_LEFT, and is configurable with the > +GL_ARB_fragment_coord_conventions extension. > + > +DirectX 9/10 use UPPER_LEFT. > + > +FS_COORD_PIXEL_CENTER > +""""""""""""""""""""" > + > +Specifies the fragment shader TGSI_SEMANTIC_POSITION pixel center convention. > +The default value is HALF_INTEGER. > + > +If HALF_INTEGER, the fractionary part of the position will be 0.5 > +If INTEGER, the fractionary part of the position will be 0.0 > + > +Note that this does not affect the set of fragments generated by > +rasterization, which is instead controlled by gl_rasterization_rules in the > +rasterizer. > + > +OpenGL defaults to HALF_INTEGER, and is configurable with the > +GL_ARB_fragment_coord_conventions extension. > + > +DirectX 9 uses INTEGER. > +DirectX 10 uses HALF_INTEGER. > diff --git a/src/gallium/include/pipe/p_shader_tokens.h > b/src/gallium/include/pipe/p_shader_tokens.h > index b47f497..21581a4 100644 > --- a/src/gallium/include/pipe/p_shader_tokens.h > +++ b/src/gallium/include/pipe/p_shader_tokens.h > @@ -170,7 +170,9 @@ union tgsi_immediate_data > #define TGSI_PROPERTY_GS_INPUT_PRIM 0 > #define TGSI_PROPERTY_GS_OUTPUT_PRIM 1 > #define TGSI_PROPERTY_GS_MAX_VERTICES 2 > -#define TGSI_PROPERTY_COUNT 3 > +#define TGSI_PROPERTY_FS_COORD_ORIGIN 3 > +#define TGSI_PROPERTY_FS_COORD_PIXEL_CENTER 4 > +#define TGSI_PROPERTY_COUNT 5 > > struct tgsi_property { > unsigned Type : 4; /**< TGSI_TOKEN_TYPE_PROPERTY */ > @@ -179,6 +181,12 @@ struct tgsi_property { > unsigned Padding : 12; > }; > > +#define TGSI_FS_COORD_ORIGIN_UPPER_LEFT 0 > +#define TGSI_FS_COORD_ORIGIN_LOWER_LEFT 1 > + > +#define TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER 0 > +#define TGSI_FS_COORD_PIXEL_CENTER_INTEGER 1 > + > struct tgsi_property_data { > unsigned Data; > }; > -- > 1.6.6.1.476.g01ddb > > > ------------------------------------------------------------------------------ > The Planet: dedicated and managed hosting, cloud storage, colocation > Stay online with enterprise data centers and the best network in the business > Choose flexible plans and management services without long-term contracts > Personal 24x7 support from experience hosting pros just a phone call away. > http://p.sf.net/sfu/theplanet-com > _______________________________________________ > Mesa3d-dev mailing list > Mesa3d-dev@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/mesa3d-dev > -- Luca Barbieri ------------------------------------------------------------------------------ The Planet: dedicated and managed hosting, cloud storage, colocation Stay online with enterprise data centers and the best network in the business Choose flexible plans and management services without long-term contracts Personal 24x7 support from experience hosting pros just a phone call away. http://p.sf.net/sfu/theplanet-com _______________________________________________ Mesa3d-dev mailing list Mesa3d-dev@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mesa3d-dev