Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright 2011 Joakim Sindholt <opensource@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_STATE_H_
  24. #define _NINE_STATE_H_
  25.  
  26. #include "d3d9.h"
  27. #include "nine_defines.h"
  28. #include "pipe/p_state.h"
  29. #include "util/list.h"
  30.  
  31. #define NINED3DSAMP_MINLOD (D3DSAMP_DMAPOFFSET + 1)
  32. #define NINED3DSAMP_SHADOW (D3DSAMP_DMAPOFFSET + 2)
  33.  
  34. #define NINED3DRS_VSPOINTSIZE (D3DRS_BLENDOPALPHA + 1)
  35. #define NINED3DRS_RTMASK      (D3DRS_BLENDOPALPHA + 2)
  36. #define NINED3DRS_ZBIASSCALE  (D3DRS_BLENDOPALPHA + 3)
  37. #define NINED3DRS_ALPHACOVERAGE  (D3DRS_BLENDOPALPHA + 4)
  38.  
  39. #define D3DRS_LAST       D3DRS_BLENDOPALPHA
  40. #define NINED3DRS_LAST   NINED3DRS_ALPHACOVERAGE /* 213 */
  41. #define NINED3DSAMP_LAST NINED3DSAMP_SHADOW /* 15 */
  42. #define NINED3DTSS_LAST  D3DTSS_CONSTANT
  43. #define NINED3DTS_LAST   D3DTS_WORLDMATRIX(255)
  44.  
  45. #define D3DRS_COUNT       (D3DRS_LAST + 1)
  46. #define NINED3DRS_COUNT   (NINED3DRS_LAST + 1)
  47. #define NINED3DSAMP_COUNT (NINED3DSAMP_LAST + 1)
  48. #define NINED3DTSS_COUNT  (NINED3DTSS_LAST + 1)
  49. #define NINED3DTS_COUNT   (NINED3DTS_LAST + 1)
  50.  
  51. #define NINE_STATE_FB          (1 <<  0)
  52. #define NINE_STATE_VIEWPORT    (1 <<  1)
  53. #define NINE_STATE_SCISSOR     (1 <<  2)
  54. #define NINE_STATE_RASTERIZER  (1 <<  3)
  55. #define NINE_STATE_BLEND       (1 <<  4)
  56. #define NINE_STATE_DSA         (1 <<  5)
  57. #define NINE_STATE_VS          (1 <<  6)
  58. #define NINE_STATE_VS_CONST    (1 <<  7)
  59. #define NINE_STATE_PS          (1 <<  8)
  60. #define NINE_STATE_PS_CONST    (1 <<  9)
  61. #define NINE_STATE_TEXTURE     (1 << 10)
  62. #define NINE_STATE_SAMPLER     (1 << 11)
  63. #define NINE_STATE_VDECL       (1 << 12)
  64. #define NINE_STATE_IDXBUF      (1 << 13)
  65. #define NINE_STATE_PRIM        (1 << 14)
  66. #define NINE_STATE_MATERIAL    (1 << 15)
  67. #define NINE_STATE_BLEND_COLOR (1 << 16)
  68. #define NINE_STATE_STENCIL_REF (1 << 17)
  69. #define NINE_STATE_SAMPLE_MASK (1 << 18)
  70. #define NINE_STATE_MISC_CONST  (1 << 19)
  71. #define NINE_STATE_FF          (0x1f << 20)
  72. #define NINE_STATE_FF_VS       (0x17 << 20)
  73. #define NINE_STATE_FF_PS       (0x18 << 20)
  74. #define NINE_STATE_FF_LIGHTING (1 << 20)
  75. #define NINE_STATE_FF_MATERIAL (1 << 21)
  76. #define NINE_STATE_FF_VSTRANSF (1 << 22)
  77. #define NINE_STATE_FF_PSSTAGES (1 << 23)
  78. #define NINE_STATE_FF_OTHER    (1 << 24)
  79. #define NINE_STATE_ALL          0x1ffffff
  80. #define NINE_STATE_UNHANDLED   (1 << 25)
  81.  
  82.  
  83. #define NINE_MAX_SIMULTANEOUS_RENDERTARGETS 4
  84. #define NINE_MAX_CONST_F_PS3 224
  85. #define NINE_MAX_CONST_F   256
  86. #define NINE_MAX_CONST_I   16
  87. #define NINE_MAX_CONST_B   16
  88. #define NINE_MAX_CONST_ALL 276 /* B consts count only 1/4 th */
  89.  
  90. #define NINE_CONST_I_BASE(nconstf) \
  91.     ((nconstf)        * 4 * sizeof(float))
  92. #define NINE_CONST_B_BASE(nconstf) \
  93.     ((nconstf)        * 4 * sizeof(float) + \
  94.      NINE_MAX_CONST_I * 4 * sizeof(int))
  95.  
  96.  
  97. #define NINE_MAX_LIGHTS        65536
  98. #define NINE_MAX_LIGHTS_ACTIVE 8
  99.  
  100. #define NINED3DLIGHT_INVALID (D3DLIGHT_DIRECTIONAL + 1)
  101.  
  102. #define NINE_MAX_SAMPLERS_PS 16
  103. #define NINE_MAX_SAMPLERS_VS  4
  104. #define NINE_MAX_SAMPLERS    21 /* PS + DMAP + VS */
  105. #define NINE_SAMPLER_PS(s)  ( 0 + (s))
  106. #define NINE_SAMPLER_DMAP    16
  107. #define NINE_SAMPLER_VS(s)  (17 + (s))
  108. #define NINE_PS_SAMPLERS_MASK 0x00ffff
  109. #define NINE_VS_SAMPLERS_MASK 0x1e0000
  110.  
  111. struct nine_state
  112. {
  113.     struct {
  114.         uint32_t group;
  115.         uint32_t rs[(NINED3DRS_COUNT + 31) / 32];
  116.         uint32_t vtxbuf;
  117.         uint32_t stream_freq;
  118.         uint32_t texture;
  119.         uint16_t sampler[NINE_MAX_SAMPLERS];
  120.         struct nine_range *vs_const_f;
  121.         struct nine_range *ps_const_f;
  122.         uint16_t vs_const_i; /* NINE_MAX_CONST_I == 16 */
  123.         uint16_t ps_const_i;
  124.         uint16_t vs_const_b; /* NINE_MAX_CONST_B == 16 */
  125.         uint16_t ps_const_b;
  126.         uint8_t ucp;
  127.         boolean srgb;
  128.     } changed;
  129.  
  130.     struct NineSurface9 *rt[NINE_MAX_SIMULTANEOUS_RENDERTARGETS];
  131.     struct NineSurface9 *ds;
  132.  
  133.     D3DVIEWPORT9 viewport;
  134.  
  135.     struct pipe_scissor_state scissor;
  136.  
  137.     /* NOTE: vs, ps will be NULL for FF and are set in device->ff.vs,ps instead
  138.      *  (XXX: or is it better to reference FF shaders here, too ?)
  139.      * NOTE: const_f contains extra space for const_i,b to use as user constbuf
  140.      */
  141.     struct NineVertexShader9 *vs;
  142.     float *vs_const_f;
  143.     int    vs_const_i[NINE_MAX_CONST_I][4];
  144.     BOOL   vs_const_b[NINE_MAX_CONST_B];
  145.     float *vs_lconstf_temp;
  146.     uint32_t vs_key;
  147.  
  148.     struct NinePixelShader9 *ps;
  149.     float *ps_const_f;
  150.     int    ps_const_i[NINE_MAX_CONST_I][4];
  151.     BOOL   ps_const_b[NINE_MAX_CONST_B];
  152.     uint32_t ps_key;
  153.  
  154.     struct {
  155.         void *vs;
  156.         void *ps;
  157.     } cso;
  158.  
  159.     struct NineVertexDeclaration9 *vdecl;
  160.  
  161.     struct NineIndexBuffer9   *idxbuf;
  162.     struct NineVertexBuffer9  *stream[PIPE_MAX_ATTRIBS];
  163.     struct pipe_vertex_buffer  vtxbuf[PIPE_MAX_ATTRIBS];
  164.     UINT stream_freq[PIPE_MAX_ATTRIBS];
  165.     uint32_t stream_instancedata_mask; /* derived from stream_freq */
  166.     uint32_t stream_usage_mask; /* derived from VS and vdecl */
  167.  
  168.     struct pipe_clip_state clip;
  169.     struct pipe_framebuffer_state fb;
  170.     uint8_t rt_mask;
  171.  
  172.     DWORD rs[NINED3DRS_COUNT];
  173.  
  174.     struct NineBaseTexture9 *texture[NINE_MAX_SAMPLERS]; /* PS, DMAP, VS */
  175.  
  176.     DWORD samp[NINE_MAX_SAMPLERS][NINED3DSAMP_COUNT];
  177.     uint32_t samplers_shadow;
  178.     uint8_t bound_samplers_mask_vs;
  179.     uint16_t bound_samplers_mask_ps;
  180.  
  181.     int dummy_vbo_bound_at; /* -1 = not bound , >= 0 = bound index */
  182.     boolean vbo_bound_done;
  183.  
  184.     struct {
  185.         struct {
  186.             uint32_t group;
  187.             uint32_t tex_stage[NINE_MAX_SAMPLERS][(NINED3DTSS_COUNT + 31) / 32];
  188.             uint32_t transform[(NINED3DTS_COUNT + 31) / 32];
  189.         } changed;
  190.         struct {
  191.             boolean vs_const;
  192.             boolean ps_const;
  193.         } clobber;
  194.  
  195.         D3DMATRIX *transform; /* access only via nine_state_access_transform */
  196.         unsigned num_transforms;
  197.  
  198.         /* XXX: Do state blocks just change the set of active lights or do we
  199.          * have to store which lights have been disabled, too ?
  200.          */
  201.         D3DLIGHT9 *light;
  202.         uint16_t active_light[NINE_MAX_LIGHTS_ACTIVE]; /* 8 */
  203.         unsigned num_lights;
  204.         unsigned num_lights_active;
  205.  
  206.         D3DMATERIAL9 material;
  207.  
  208.         DWORD tex_stage[NINE_MAX_SAMPLERS][NINED3DTSS_COUNT];
  209.     } ff;
  210. };
  211.  
  212. /* map D3DRS -> NINE_STATE_x
  213.  */
  214. extern const uint32_t nine_render_state_group[NINED3DRS_COUNT];
  215.  
  216. /* for D3DSBT_PIXEL/VERTEX:
  217.  */
  218. extern const uint32_t nine_render_states_pixel[(NINED3DRS_COUNT + 31) / 32];
  219. extern const uint32_t nine_render_states_vertex[(NINED3DRS_COUNT + 31) / 32];
  220.  
  221. struct NineDevice9;
  222.  
  223. boolean nine_update_state(struct NineDevice9 *, uint32_t group_mask);
  224.  
  225. void nine_state_set_defaults(struct NineDevice9 *, const D3DCAPS9 *,
  226.                              boolean is_reset);
  227. void nine_state_clear(struct nine_state *, const boolean device);
  228.  
  229. /* If @alloc is FALSE, the return value may be a const identity matrix.
  230.  * Therefore, do not modify if you set alloc to FALSE !
  231.  */
  232. D3DMATRIX *
  233. nine_state_access_transform(struct nine_state *, D3DTRANSFORMSTATETYPE,
  234.                             boolean alloc);
  235.  
  236. const char *nine_d3drs_to_string(DWORD State);
  237.  
  238. #endif /* _NINE_STATE_H_ */
  239.