1
/**************************************************************************
3
* Copyright 2009 VMware, Inc.
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:
14
* The above copyright notice and this permission notice (including the
15
* next paragraph) shall be included in all copies or substantial portions
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 VMWARE 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.
26
**************************************************************************/
31
#include "draw_context.h"
32
#include "tgsi/tgsi_exec.h"
33
#include "draw_private.h"
35
#define MAX_TGSI_PRIMITIVES 4
39
#ifdef DRAW_LLVM_AVAILABLE
40
struct draw_gs_jit_context;
41
struct draw_gs_llvm_variant;
44
* Structure holding the inputs to the geometry shader. It uses SOA layout.
45
* The dimensions are as follows:
46
* - maximum number of vertices for a geometry shader input primitive
47
* (6 for triangle_adjacency)
48
* - maximum number of attributes for each vertex
49
* - four channels per each attribute (x,y,z,w)
50
* - number of input primitives equal to the SOA vector length
52
struct draw_gs_inputs {
53
float data[6][PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS][TGSI_NUM_CHANNELS];
58
* Private version of the compiled geometry shader
60
struct draw_vertex_stream {
61
unsigned *primitive_lengths;
62
unsigned emitted_vertices;
63
unsigned emitted_primitives;
64
float (*tmp_output)[4];
67
struct draw_geometry_shader {
68
struct draw_context *draw;
70
struct tgsi_exec_machine *machine;
72
/* This member will disappear shortly:*/
73
struct pipe_shader_state state;
75
struct tgsi_shader_info info;
76
unsigned position_output;
77
unsigned viewport_index_output;
78
unsigned clipvertex_output;
79
unsigned ccdistance_output[PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT];
81
unsigned max_output_vertices;
82
unsigned primitive_boundary;
83
unsigned input_primitive;
84
unsigned output_primitive;
87
struct draw_vertex_stream stream[TGSI_MAX_VERTEX_STREAMS];
88
unsigned num_vertex_streams;
91
unsigned input_vertex_stride;
92
unsigned fetched_prim_count;
93
const float (*input)[4];
94
const struct tgsi_shader_info *input_info;
95
unsigned vector_length;
96
unsigned max_out_prims;
98
unsigned num_invocations;
99
unsigned invocation_id;
100
#ifdef DRAW_LLVM_AVAILABLE
101
struct draw_gs_inputs *gs_input;
102
struct draw_gs_jit_context *jit_context;
103
struct draw_gs_llvm_variant *current_variant;
104
struct vertex_header *gs_output[PIPE_MAX_VERTEX_STREAMS];
106
int **llvm_prim_lengths;
107
int *llvm_emitted_primitives;
108
int *llvm_emitted_vertices;
112
void (*fetch_inputs)(struct draw_geometry_shader *shader,
114
unsigned num_vertices,
116
void (*fetch_outputs)(struct draw_geometry_shader *shader,
117
unsigned vertex_stream,
118
unsigned num_primitives,
119
float (**p_output)[4]);
121
void (*prepare)(struct draw_geometry_shader *shader,
122
const void *constants[PIPE_MAX_CONSTANT_BUFFERS],
123
const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS]);
124
void (*run)(struct draw_geometry_shader *shader,
125
unsigned input_primitives, unsigned *out_prims);
128
void draw_geometry_shader_new_instance(struct draw_geometry_shader *gs);
131
* Returns the number of vertices emitted.
132
* The vertex shader can emit any number of vertices as long as it's
133
* smaller than the GS_MAX_OUTPUT_VERTICES shader property.
135
int draw_geometry_shader_run(struct draw_geometry_shader *shader,
136
const void *constants[PIPE_MAX_CONSTANT_BUFFERS],
137
const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS],
138
const struct draw_vertex_info *input_verts,
139
const struct draw_prim_info *input_prim,
140
const struct tgsi_shader_info *input_info,
141
struct draw_vertex_info *output_verts,
142
struct draw_prim_info *output_prims );
144
void draw_geometry_shader_prepare(struct draw_geometry_shader *shader,
145
struct draw_context *draw);
147
int draw_gs_max_output_vertices(struct draw_geometry_shader *shader,
150
#ifdef DRAW_LLVM_AVAILABLE
151
void draw_gs_set_current_variant(struct draw_geometry_shader *shader,
152
struct draw_gs_llvm_variant *variant);