We don't translate it away. The property does 2 things not available in the pipe interface: - It disables viewport clipping, so that window coordinates can pass through untouched. - It disables viewport transformation.
Our hardware is capable of both, however, some APIs are not. Marek On Wed, May 21, 2014 at 12:42 PM, Roland Scheidegger <srol...@vmware.com> wrote: > On 05/21/2014 12:49 AM, Marek Olšák wrote: >> >> Hi, >> >> Could somebody from VMWare please review this patch? It's for st/nine >> (open d3d9 state tracker). >> >> Thanks, >> >> Marek >> >> On Sat, May 17, 2014 at 1:20 AM, Automated rebase >> <david.heidelber...@ixit.cz> wrote: >>> >>> From: Christoph Bumiller <e0425...@student.tuwien.ac.at> >>> >>> --- >>> src/gallium/auxiliary/tgsi/tgsi_strings.c | 3 ++- >>> src/gallium/auxiliary/tgsi/tgsi_ureg.c | 16 ++++++++++++++++ >>> src/gallium/auxiliary/tgsi/tgsi_ureg.h | 4 ++++ >>> src/gallium/docs/source/tgsi.rst | 9 +++++++++ >>> src/gallium/include/pipe/p_shader_tokens.h | 3 ++- >>> 5 files changed, 33 insertions(+), 2 deletions(-) >>> >>> diff --git a/src/gallium/auxiliary/tgsi/tgsi_strings.c >>> b/src/gallium/auxiliary/tgsi/tgsi_strings.c >>> index 5b6e47f..c3e7118 100644 >>> --- a/src/gallium/auxiliary/tgsi/tgsi_strings.c >>> +++ b/src/gallium/auxiliary/tgsi/tgsi_strings.c >>> @@ -120,7 +120,8 @@ const char *tgsi_property_names[TGSI_PROPERTY_COUNT] >>> = >>> "FS_COORD_PIXEL_CENTER", >>> "FS_COLOR0_WRITES_ALL_CBUFS", >>> "FS_DEPTH_LAYOUT", >>> - "VS_PROHIBIT_UCPS" >>> + "VS_PROHIBIT_UCPS", >>> + "VS_POSITION_WINDOW_SPACE" >>> }; >>> >>> const char *tgsi_type_names[5] = >>> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c >>> b/src/gallium/auxiliary/tgsi/tgsi_ureg.c >>> index 2bf93ee..bd0a3f7 100644 >>> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c >>> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c >>> @@ -173,6 +173,7 @@ struct ureg_program >>> 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 char property_fs_depth_layout; /* TGSI_FS_DEPTH_LAYOUT */ >>> + boolean property_vs_window_space_position; /* >>> TGSI_VS_WINDOW_SPACE_POSITION */ >>> >>> unsigned nr_addrs; >>> unsigned nr_preds; >>> @@ -331,6 +332,13 @@ ureg_property_fs_depth_layout(struct ureg_program >>> *ureg, >>> ureg->property_fs_depth_layout = fs_depth_layout; >>> } >>> >>> +void >>> +ureg_property_vs_window_space_position(struct ureg_program *ureg, >>> + boolean vs_window_space_position) >>> +{ >>> + ureg->property_vs_window_space_position = vs_window_space_position; >>> +} >>> + >>> struct ureg_src >>> ureg_DECL_fs_input_cyl_centroid(struct ureg_program *ureg, >>> unsigned semantic_name, >>> @@ -1508,6 +1516,14 @@ static void emit_decls( struct ureg_program *ureg >>> ) >>> ureg->property_fs_depth_layout); >>> } >>> >>> + if (ureg->property_vs_window_space_position) { >>> + assert(ureg->processor == TGSI_PROCESSOR_VERTEX); >>> + >>> + emit_property(ureg, >>> + TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION, >>> + ureg->property_vs_window_space_position); >>> + } >>> + >>> 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 a0a50b7..28edea6 100644 >>> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h >>> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h >>> @@ -184,6 +184,10 @@ void >>> ureg_property_fs_depth_layout(struct ureg_program *ureg, >>> unsigned fs_depth_layout); >>> >>> +void >>> +ureg_property_vs_window_space_position(struct ureg_program *ureg, >>> + boolean >>> vs_window_space_position); >>> + >>> >>> >>> /*********************************************************************** >>> * Build shader declarations: >>> diff --git a/src/gallium/docs/source/tgsi.rst >>> b/src/gallium/docs/source/tgsi.rst >>> index 9500b9d..2ca3c3b 100644 >>> --- a/src/gallium/docs/source/tgsi.rst >>> +++ b/src/gallium/docs/source/tgsi.rst >>> @@ -2848,6 +2848,15 @@ input primitive. Each invocation will have a >>> different >>> TGSI_SEMANTIC_INVOCATIONID system value set. If not specified, assumed >>> to >>> be 1. >>> >>> +VS_WINDOW_SPACE_POSITION >>> +"""""""""""""""""""""""""" >>> +If this property is set on the vertex shader, the TGSI_SEMANTIC_POSITION >>> output >>> +is assumed to contain window space coordinates. >>> +Division of X,Y,Z by W and the viewport transformation are disabled, and >>> 1/W is >>> +directly taken from the 4-th component of the shader output. >>> +Naturally, clipping is not performed on window coordinates either. >>> +The effect of this property is undefined if a geometry or tessellation >>> shader >>> +are in use. >>> >>> 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 d095bd3..9261b79 100644 >>> --- a/src/gallium/include/pipe/p_shader_tokens.h >>> +++ b/src/gallium/include/pipe/p_shader_tokens.h >>> @@ -237,7 +237,8 @@ union tgsi_immediate_data >>> #define TGSI_PROPERTY_FS_DEPTH_LAYOUT 6 >>> #define TGSI_PROPERTY_VS_PROHIBIT_UCPS 7 >>> #define TGSI_PROPERTY_GS_INVOCATIONS 8 >>> -#define TGSI_PROPERTY_COUNT 9 >>> +#define TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION 9 >>> +#define TGSI_PROPERTY_COUNT 10 >>> >>> struct tgsi_property { >>> unsigned Type : 4; /**< TGSI_TOKEN_TYPE_PROPERTY */ >>> -- > > > I can't say I'm a big fan of it (I guess alternatively you could use a > TGSI_SEMANTIC_POSITIONT output but that doesn't really make a difference > neither). > This was quite some d3d hack which doesn't really fit into a modern shader > based world (of course, it doesn't work with d3d10 neither). So, the usual > way to deal with this is to translate this away, since this was only used > for old or simple stuff afaik (if it was complex you tend to not already > know the screen space coords) noone is going to care if it runs at 1500 or > 1520 fps anyway. > But if you really think this is a must have and are going to use it in a > public state tracker you probably have to implement a cap bit for it too, > and be able to deal with drivers which can't handle it - it seems > unreasonable to me to assume all drivers will handle it (hence you don't > really save anything in the state tracker, you still need all the code > translating it away anyway). > > Roland > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev