Home | History | Annotate | Download | only in nine
      1 /*
      2  * Copyright 2011 Joakim Sindholt <opensource (at) zhasha.com>
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * on the rights to use, copy, modify, merge, publish, distribute, sub
      8  * license, and/or sell copies of the Software, and to permit persons to whom
      9  * the Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
     18  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
     19  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
     20  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
     21  * USE OR OTHER DEALINGS IN THE SOFTWARE. */
     22 
     23 #ifndef _NINE_VERTEXSHADER9_H_
     24 #define _NINE_VERTEXSHADER9_H_
     25 
     26 #include "util/u_half.h"
     27 
     28 #include "iunknown.h"
     29 #include "device9.h"
     30 #include "nine_helpers.h"
     31 #include "nine_shader.h"
     32 #include "nine_state.h"
     33 
     34 struct NineVertexDeclaration9;
     35 
     36 struct NineVertexShader9
     37 {
     38     struct NineUnknown base;
     39     struct nine_shader_variant variant;
     40 
     41     struct {
     42         uint16_t ndecl; /* NINE_DECLUSAGE_x */
     43     } input_map[PIPE_MAX_ATTRIBS];
     44     unsigned num_inputs;
     45 
     46     struct {
     47         const DWORD *tokens;
     48         DWORD size;
     49         uint8_t version; /* (major << 4) | minor */
     50     } byte_code;
     51 
     52     uint8_t sampler_mask;
     53 
     54     boolean position_t; /* if true, disable vport transform */
     55     boolean point_size; /* if true, set rasterizer.point_size_per_vertex to 1 */
     56     boolean swvp_only;
     57 
     58     unsigned const_used_size; /* in bytes */
     59 
     60     struct nine_lconstf lconstf;
     61 
     62     uint64_t ff_key[3];
     63     void *ff_cso;
     64 
     65     uint64_t last_key;
     66     void *last_cso;
     67 
     68     uint64_t next_key;
     69 
     70     /* so */
     71     struct nine_shader_variant_so variant_so;
     72 };
     73 static inline struct NineVertexShader9 *
     74 NineVertexShader9( void *data )
     75 {
     76     return (struct NineVertexShader9 *)data;
     77 }
     78 
     79 static inline BOOL
     80 NineVertexShader9_UpdateKey( struct NineVertexShader9 *vs,
     81                              struct NineDevice9 *device )
     82 {
     83     struct nine_context *context = &(device->context);
     84     uint8_t samplers_shadow;
     85     uint64_t key;
     86     BOOL res;
     87 
     88     samplers_shadow = (uint8_t)((context->samplers_shadow & NINE_VS_SAMPLERS_MASK) >> NINE_SAMPLER_VS(0));
     89     samplers_shadow &= vs->sampler_mask;
     90     key = samplers_shadow;
     91 
     92     if (vs->byte_code.version < 0x30)
     93         key |= (uint32_t) ((!!context->rs[D3DRS_FOGENABLE]) << 8);
     94     key |= (uint32_t) (context->swvp << 9);
     95 
     96     /* We want to use a 64 bits key for performance.
     97      * Use compressed float16 values for the pointsize min/max in the key.
     98      * Shaders do not usually output psize.*/
     99     if (vs->point_size) {
    100         key |= ((uint64_t)util_float_to_half(asfloat(context->rs[D3DRS_POINTSIZE_MIN]))) << 32;
    101         key |= ((uint64_t)util_float_to_half(asfloat(context->rs[D3DRS_POINTSIZE_MAX]))) << 48;
    102     }
    103 
    104     res = vs->last_key != key;
    105     if (res)
    106         vs->next_key = key;
    107     return res;
    108 }
    109 
    110 void *
    111 NineVertexShader9_GetVariant( struct NineVertexShader9 *vs );
    112 
    113 void *
    114 NineVertexShader9_GetVariantProcessVertices( struct NineVertexShader9 *vs,
    115                                              struct NineVertexDeclaration9 *vdecl_out,
    116                                              struct pipe_stream_output_info *so );
    117 
    118 /*** public ***/
    119 
    120 HRESULT
    121 NineVertexShader9_new( struct NineDevice9 *pDevice,
    122                        struct NineVertexShader9 **ppOut,
    123                        const DWORD *pFunction, void *cso );
    124 
    125 HRESULT
    126 NineVertexShader9_ctor( struct NineVertexShader9 *,
    127                         struct NineUnknownParams *pParams,
    128                         const DWORD *pFunction, void *cso );
    129 
    130 void
    131 NineVertexShader9_dtor( struct NineVertexShader9 * );
    132 
    133 HRESULT NINE_WINAPI
    134 NineVertexShader9_GetFunction( struct NineVertexShader9 *This,
    135                                void *pData,
    136                                UINT *pSizeOfData );
    137 
    138 #endif /* _NINE_VERTEXSHADER9_H_ */
    139