Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/auxiliary/draw/draw_gs.h
4565 views
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 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.
25
*
26
**************************************************************************/
27
28
#ifndef DRAW_GS_H
29
#define DRAW_GS_H
30
31
#include "draw_context.h"
32
#include "tgsi/tgsi_exec.h"
33
#include "draw_private.h"
34
35
#define MAX_TGSI_PRIMITIVES 4
36
37
struct draw_context;
38
39
#ifdef DRAW_LLVM_AVAILABLE
40
struct draw_gs_jit_context;
41
struct draw_gs_llvm_variant;
42
43
/**
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
51
*/
52
struct draw_gs_inputs {
53
float data[6][PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS][TGSI_NUM_CHANNELS];
54
};
55
#endif
56
57
/**
58
* Private version of the compiled geometry shader
59
*/
60
struct draw_vertex_stream {
61
unsigned *primitive_lengths;
62
unsigned emitted_vertices;
63
unsigned emitted_primitives;
64
float (*tmp_output)[4];
65
};
66
67
struct draw_geometry_shader {
68
struct draw_context *draw;
69
70
struct tgsi_exec_machine *machine;
71
72
/* This member will disappear shortly:*/
73
struct pipe_shader_state state;
74
75
struct tgsi_shader_info info;
76
unsigned position_output;
77
unsigned viewport_index_output;
78
unsigned ccdistance_output[PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT];
79
80
unsigned max_output_vertices;
81
unsigned primitive_boundary;
82
unsigned input_primitive;
83
unsigned output_primitive;
84
unsigned vertex_size;
85
86
struct draw_vertex_stream stream[TGSI_MAX_VERTEX_STREAMS];
87
unsigned num_vertex_streams;
88
89
unsigned in_prim_idx;
90
unsigned input_vertex_stride;
91
unsigned fetched_prim_count;
92
const float (*input)[4];
93
const struct tgsi_shader_info *input_info;
94
unsigned vector_length;
95
unsigned max_out_prims;
96
97
unsigned num_invocations;
98
unsigned invocation_id;
99
#ifdef DRAW_LLVM_AVAILABLE
100
struct draw_gs_inputs *gs_input;
101
struct draw_gs_jit_context *jit_context;
102
struct draw_gs_llvm_variant *current_variant;
103
struct vertex_header *gs_output[PIPE_MAX_VERTEX_STREAMS];
104
105
int **llvm_prim_lengths;
106
int *llvm_emitted_primitives;
107
int *llvm_emitted_vertices;
108
int *llvm_prim_ids;
109
#endif
110
111
void (*fetch_inputs)(struct draw_geometry_shader *shader,
112
unsigned *indices,
113
unsigned num_vertices,
114
unsigned prim_idx);
115
void (*fetch_outputs)(struct draw_geometry_shader *shader,
116
unsigned vertex_stream,
117
unsigned num_primitives,
118
float (**p_output)[4]);
119
120
void (*prepare)(struct draw_geometry_shader *shader,
121
const void *constants[PIPE_MAX_CONSTANT_BUFFERS],
122
const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS]);
123
void (*run)(struct draw_geometry_shader *shader,
124
unsigned input_primitives, unsigned *out_prims);
125
};
126
127
void draw_geometry_shader_new_instance(struct draw_geometry_shader *gs);
128
129
/*
130
* Returns the number of vertices emitted.
131
* The vertex shader can emit any number of vertices as long as it's
132
* smaller than the GS_MAX_OUTPUT_VERTICES shader property.
133
*/
134
int draw_geometry_shader_run(struct draw_geometry_shader *shader,
135
const void *constants[PIPE_MAX_CONSTANT_BUFFERS],
136
const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS],
137
const struct draw_vertex_info *input_verts,
138
const struct draw_prim_info *input_prim,
139
const struct tgsi_shader_info *input_info,
140
struct draw_vertex_info *output_verts,
141
struct draw_prim_info *output_prims );
142
143
void draw_geometry_shader_prepare(struct draw_geometry_shader *shader,
144
struct draw_context *draw);
145
146
int draw_gs_max_output_vertices(struct draw_geometry_shader *shader,
147
unsigned pipe_prim);
148
149
#ifdef DRAW_LLVM_AVAILABLE
150
void draw_gs_set_current_variant(struct draw_geometry_shader *shader,
151
struct draw_gs_llvm_variant *variant);
152
#endif
153
154
#endif
155
156