Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2009 VMware, Inc.
  4.  * All Rights Reserved.
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a
  7.  * copy of this software and associated documentation files (the
  8.  * "Software"), to deal in the Software without restriction, including
  9.  * without limitation the rights to use, copy, modify, merge, publish,
  10.  * distribute, sub license, and/or sell copies of the Software, and to
  11.  * permit persons to whom the Software is furnished to do so, subject to
  12.  * the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice (including the
  15.  * next paragraph) shall be included in all copies or substantial portions
  16.  * of the Software.
  17.  *
  18.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  19.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  20.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  21.  * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
  22.  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  23.  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  24.  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  25.  *
  26.  **************************************************************************/
  27.  
  28. #ifndef DRAW_GS_H
  29. #define DRAW_GS_H
  30.  
  31. #include "draw_context.h"
  32. #include "draw_private.h"
  33.  
  34. #define MAX_TGSI_PRIMITIVES 4
  35.  
  36. struct draw_context;
  37.  
  38. #ifdef HAVE_LLVM
  39. struct draw_gs_jit_context;
  40. struct draw_gs_llvm_variant;
  41.  
  42. /**
  43.  * Structure holding the inputs to the geometry shader. It uses SOA layout.
  44.  * The dimensions are as follows:
  45.  * - maximum number of vertices for a geometry shader input primitive
  46.  *   (6 for triangle_adjacency)
  47.  * - maximum number of attributes for each vertex
  48.  * - four channels per each attribute (x,y,z,w)
  49.  * - number of input primitives equal to the SOA vector length
  50.  */
  51. struct draw_gs_inputs {
  52.    float data[6][PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS][TGSI_NUM_CHANNELS];
  53. };
  54. #endif
  55.  
  56. /**
  57.  * Private version of the compiled geometry shader
  58.  */
  59. struct draw_geometry_shader {
  60.    struct draw_context *draw;
  61.  
  62.    struct tgsi_exec_machine *machine;
  63.  
  64.    /* This member will disappear shortly:*/
  65.    struct pipe_shader_state state;
  66.  
  67.    struct tgsi_shader_info info;
  68.    unsigned position_output;
  69.    unsigned viewport_index_output;
  70.    unsigned clipdistance_output[PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT];
  71.    unsigned culldistance_output[PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT];
  72.  
  73.    unsigned max_output_vertices;
  74.    unsigned primitive_boundary;
  75.    unsigned input_primitive;
  76.    unsigned output_primitive;
  77.  
  78.    unsigned *primitive_lengths;
  79.    unsigned emitted_vertices;
  80.    unsigned emitted_primitives;
  81.  
  82.    float (*tmp_output)[4];
  83.    unsigned vertex_size;
  84.  
  85.    unsigned in_prim_idx;
  86.    unsigned input_vertex_stride;
  87.    unsigned fetched_prim_count;
  88.    const float (*input)[4];
  89.    const struct tgsi_shader_info *input_info;
  90.    unsigned vector_length;
  91.    unsigned max_out_prims;
  92.  
  93. #ifdef HAVE_LLVM
  94.    struct draw_gs_inputs *gs_input;
  95.    struct draw_gs_jit_context *jit_context;
  96.    struct draw_gs_llvm_variant *current_variant;
  97.    struct vertex_header *gs_output;
  98.  
  99.    int **llvm_prim_lengths;
  100.    int *llvm_emitted_primitives;
  101.    int *llvm_emitted_vertices;
  102.    int *llvm_prim_ids;
  103. #endif
  104.  
  105.    void (*fetch_inputs)(struct draw_geometry_shader *shader,
  106.                         unsigned *indices,
  107.                         unsigned num_vertices,
  108.                         unsigned prim_idx);
  109.    void (*fetch_outputs)(struct draw_geometry_shader *shader,
  110.                          unsigned num_primitives,
  111.                          float (**p_output)[4]);
  112.  
  113.    void     (*prepare)(struct draw_geometry_shader *shader,
  114.                        const void *constants[PIPE_MAX_CONSTANT_BUFFERS],
  115.                        const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS]);
  116.    unsigned (*run)(struct draw_geometry_shader *shader,
  117.                    unsigned input_primitives);
  118. };
  119.  
  120. void draw_geometry_shader_new_instance(struct draw_geometry_shader *gs);
  121.  
  122. /*
  123.  * Returns the number of vertices emitted.
  124.  * The vertex shader can emit any number of vertices as long as it's
  125.  * smaller than the GS_MAX_OUTPUT_VERTICES shader property.
  126.  */
  127. int draw_geometry_shader_run(struct draw_geometry_shader *shader,
  128.                              const void *constants[PIPE_MAX_CONSTANT_BUFFERS],
  129.                              const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS],
  130.                              const struct draw_vertex_info *input_verts,
  131.                              const struct draw_prim_info *input_prim,
  132.                              const struct tgsi_shader_info *input_info,
  133.                              struct draw_vertex_info *output_verts,
  134.                              struct draw_prim_info *output_prims );
  135.  
  136. void draw_geometry_shader_prepare(struct draw_geometry_shader *shader,
  137.                                   struct draw_context *draw);
  138.  
  139. int draw_gs_max_output_vertices(struct draw_geometry_shader *shader,
  140.                                 unsigned pipe_prim);
  141.  
  142. #ifdef HAVE_LLVM
  143. void draw_gs_set_current_variant(struct draw_geometry_shader *shader,
  144.                                  struct draw_gs_llvm_variant *variant);
  145. #endif
  146.  
  147. #endif
  148.