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_SHADER_H_
  24. #define _NINE_SHADER_H_
  25.  
  26. #include "d3d9types.h"
  27. #include "d3d9caps.h"
  28. #include "nine_defines.h"
  29. #include "pipe/p_state.h" /* PIPE_MAX_ATTRIBS */
  30. #include "util/u_memory.h"
  31.  
  32. struct NineDevice9;
  33.  
  34. struct nine_lconstf /* NOTE: both pointers should be FREE'd by the user */
  35. {
  36.     struct nine_range *ranges; /* single MALLOC, but next-pointers valid */
  37.     float *data;
  38. };
  39.  
  40. struct nine_shader_info
  41. {
  42.     unsigned type; /* in, PIPE_SHADER_x */
  43.  
  44.     uint8_t version; /* (major << 4) | minor */
  45.  
  46.     const DWORD *byte_code; /* in, pointer to shader tokens */
  47.     DWORD        byte_size; /* out, size of data at byte_code */
  48.  
  49.     void *cso; /* out, pipe cso for bind_vs,fs_state */
  50.  
  51.     uint16_t input_map[PIPE_MAX_ATTRIBS]; /* VS input -> NINE_DECLUSAGE_x */
  52.     uint8_t num_inputs; /* there may be unused inputs (NINE_DECLUSAGE_NONE) */
  53.  
  54.     boolean position_t; /* out, true if VP writes pre-transformed position */
  55.     boolean point_size; /* out, true if VP writes point size */
  56.  
  57.     uint32_t sampler_ps1xtypes; /* 2 bits per sampler */
  58.     uint16_t sampler_mask; /* out, which samplers are being used */
  59.     uint16_t sampler_mask_shadow; /* in, which samplers use depth compare */
  60.     uint8_t rt_mask; /* out, which render targets are being written */
  61.  
  62.     unsigned const_i_base; /* in vec4 (16 byte) units */
  63.     unsigned const_b_base; /* in vec4 (16 byte) units */
  64.     unsigned const_used_size;
  65.  
  66.     unsigned const_float_slots;
  67.     unsigned const_int_slots;
  68.     unsigned const_bool_slots;
  69.  
  70.     struct nine_lconstf lconstf; /* out, NOTE: members to be free'd by user */
  71. };
  72.  
  73. static INLINE void
  74. nine_info_mark_const_f_used(struct nine_shader_info *info, int idx)
  75. {
  76.     if (info->const_float_slots < (idx + 1))
  77.         info->const_float_slots = idx + 1;
  78. }
  79. static INLINE void
  80. nine_info_mark_const_i_used(struct nine_shader_info *info, int idx)
  81. {
  82.     if (info->const_int_slots < (idx + 1))
  83.         info->const_int_slots = idx + 1;
  84. }
  85. static INLINE void
  86. nine_info_mark_const_b_used(struct nine_shader_info *info, int idx)
  87. {
  88.     if (info->const_bool_slots < (idx + 1))
  89.         info->const_bool_slots = idx + 1;
  90. }
  91.  
  92. HRESULT
  93. nine_translate_shader(struct NineDevice9 *device, struct nine_shader_info *);
  94.  
  95.  
  96. struct nine_shader_variant
  97. {
  98.     struct nine_shader_variant *next;
  99.     void *cso;
  100.     uint32_t key;
  101. };
  102.  
  103. static INLINE void *
  104. nine_shader_variant_get(struct nine_shader_variant *list, uint32_t key)
  105. {
  106.     while (list->key != key && list->next)
  107.         list = list->next;
  108.     if (list->key == key)
  109.         return list->cso;
  110.     return NULL;
  111. }
  112.  
  113. static INLINE boolean
  114. nine_shader_variant_add(struct nine_shader_variant *list,
  115.                         uint32_t key, void *cso)
  116. {
  117.     while (list->next) {
  118.         assert(list->key != key);
  119.         list = list->next;
  120.     }
  121.     list->next = MALLOC_STRUCT(nine_shader_variant);
  122.     if (!list->next)
  123.         return FALSE;
  124.     list->next->next = NULL;
  125.     list->next->key = key;
  126.     list->next->cso = cso;
  127.     return TRUE;
  128. }
  129.  
  130. static INLINE void
  131. nine_shader_variants_free(struct nine_shader_variant *list)
  132. {
  133.     while (list->next) {
  134.         struct nine_shader_variant *ptr = list->next;
  135.         list->next = ptr->next;
  136.         FREE(ptr);
  137.     }
  138. }
  139.  
  140. #endif /* _NINE_SHADER_H_ */
  141.