On 26.01.2010 12:11, Keith Whitwell wrote: > Luca, > > I would have expected fragment coord conventions to be device state, not > a part of the shader. > > In OpenGL you specify the convention in the shader source, e.g. with "layout(...) in vec4 gl_FragCoord", so they _are_ part of the shader; I don't know about D3D. In any case, they are independent of the rasterization rules. > It seems like these new flags are really peers (or replacements?) of the > gl_rasterization_rules flag in pipe_rasterizer_state, and that the > shaders should remain unchanged. > > Also gl_rasterization_rules is set to 1 in the mesa state tracker, and yet it expects FragCoord to need inversion ... that doesn't add up.
Adding a property could be avoided if we specify the input to always be Y_0_TOP, but we might end up with double inversion in some cases. Christoph > Keith > > On Wed, 2010-01-20 at 22:38 -0800, Luca Barbieri wrote: > >> 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. >> >> It also adds 4 caps to indicate support of each of the conventios. >> These caps should be a temporary measure until all drivers support >> all conventions. >> >> Until then, the state tracker will use them to adjust WPOS and provide >> the driver something it supports. >> >> These caps include two "negative caps" indicating lack of support for >> the default DX9/DX10 upper left origin convention, and lack of support >> for the default OpenGL/DX10 half integer center convention. >> >> These are an even more a temporary measure until drivers are fixed. >> --- >> 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/include/pipe/p_defines.h | 4 ++ >> src/gallium/include/pipe/p_shader_tokens.h | 10 ++++- >> 6 files changed, 135 insertions(+), 3 deletions(-) >> >> diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c >> b/src/gallium/auxiliary/tgsi/tgsi_dump.c >> index d7ff262..5494467 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_decl( >> @@ -373,6 +387,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 9fcffed..42832ea 100644 >> --- a/src/gallium/auxiliary/tgsi/tgsi_text.c >> +++ b/src/gallium/auxiliary/tgsi/tgsi_text.c >> @@ -1116,7 +1116,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[] = >> @@ -1133,6 +1135,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 ) >> { >> @@ -1150,6 +1165,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 ) >> { >> @@ -1191,6 +1240,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 8bd6f68..ee109aa 100644 >> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c >> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c >> @@ -134,6 +134,8 @@ struct ureg_program >> unsigned nr_constant_ranges; >> >> unsigned property_gs_input_prim; >> + unsigned char property_fs_coord_origin; >> + unsigned char property_fs_coord_pixel_center; >> >> unsigned nr_addrs; >> unsigned nr_preds; >> @@ -267,6 +269,20 @@ ureg_property_gs_input_prim(struct ureg_program *ureg, >> ureg->property_gs_input_prim = gs_input_prim; >> } >> >> +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 >> @@ -1104,6 +1120,22 @@ static void emit_decls( struct ureg_program *ureg ) >> ureg->property_gs_input_prim); >> } >> >> + 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 03eaf24..63ddbf5 100644 >> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h >> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h >> @@ -127,6 +127,13 @@ void >> ureg_property_gs_input_prim(struct ureg_program *ureg, >> unsigned gs_input_prim); >> >> +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/include/pipe/p_defines.h >> b/src/gallium/include/pipe/p_defines.h >> index 35f3830..04d7e30 100644 >> --- a/src/gallium/include/pipe/p_defines.h >> +++ b/src/gallium/include/pipe/p_defines.h >> @@ -405,6 +405,10 @@ enum pipe_transfer_usage { >> #define PIPE_CAP_MAX_PREDICATE_REGISTERS 30 >> #define PIPE_CAP_MAX_COMBINED_SAMPLERS 31 /*< Maximum texture image >> units accessible from vertex >> and fragment shaders >> combined */ >> +#define PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT 32 >> +#define PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER 33 >> +#define PIPE_NO_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT 34 >> +#define PIPE_NO_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER 35 >> >> >> /** >> diff --git a/src/gallium/include/pipe/p_shader_tokens.h >> b/src/gallium/include/pipe/p_shader_tokens.h >> index b489b04..4134c70 100644 >> --- a/src/gallium/include/pipe/p_shader_tokens.h >> +++ b/src/gallium/include/pipe/p_shader_tokens.h >> @@ -163,7 +163,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 */ >> @@ -172,6 +174,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.3.3 >> >> >> ------------------------------------------------------------------------------ >> Throughout its 18-year history, RSA Conference consistently attracts the >> world's best and brightest in the field, creating opportunities for >> Conference >> attendees to learn about information security's most important issues through >> interactions with peers, luminaries and emerging and established companies. >> http://p.sf.net/sfu/rsaconf-dev2dev >> _______________________________________________ >> Mesa3d-dev mailing list >> Mesa3d-dev@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/mesa3d-dev >> > > > ------------------------------------------------------------------------------ > 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 > ------------------------------------------------------------------------------ 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