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
>> [email protected]
>> 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
> [email protected]
> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev