blob: b133fc2aec3ff7edd5d93fee32ae8ab2313af65b [file] [log] [blame]
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -06001/*
2 * XGL
3 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
25#ifndef PIPELINE_H
26#define PIPELINE_H
27
28#include "intel.h"
29#include "obj.h"
30#include "dev.h"
31
32#define INTEL_MAX_DRAW_BUFFERS 8
33#define INTEL_MAX_CONST_BUFFERS (1 + 12)
34#define INTEL_MAX_SAMPLER_VIEWS 16
35#define INTEL_MAX_SAMPLERS 16
36#define INTEL_MAX_SO_BINDINGS 64
37#define INTEL_MAX_SO_BUFFERS 4
38#define INTEL_MAX_VIEWPORTS 1
39
40#define INTEL_MAX_VS_SURFACES (INTEL_MAX_CONST_BUFFERS + INTEL_MAX_SAMPLER_VIEWS)
41#define INTEL_VS_CONST_SURFACE(i) (i)
42#define INTEL_VS_TEXTURE_SURFACE(i) (INTEL_MAX_CONST_BUFFERS + i)
43
44#define INTEL_MAX_GS_SURFACES (INTEL_MAX_SO_BINDINGS)
45#define INTEL_GS_SO_SURFACE(i) (i)
46
47#define INTEL_MAX_WM_SURFACES (INTEL_MAX_DRAW_BUFFERS + INTEL_MAX_CONST_BUFFERS + INTEL_MAX_SAMPLER_VIEWS)
48#define INTEL_WM_DRAW_SURFACE(i) (i)
49#define INTEL_WM_CONST_SURFACE(i) (INTEL_MAX_DRAW_BUFFERS + i)
50#define INTEL_WM_TEXTURE_SURFACE(i) (INTEL_MAX_DRAW_BUFFERS + INTEL_MAX_CONST_BUFFERS + i)
51
52#define SHADER_VERTEX_FLAG (1 << XGL_SHADER_STAGE_VERTEX)
53#define SHADER_TESS_CONTROL_FLAG (1 << XGL_SHADER_STAGE_TESS_CONTROL)
54#define SHADER_TESS_EVAL_FLAG (1 << XGL_SHADER_STAGE_TESS_EVALUATION)
55#define SHADER_GEOMETRY_FLAG (1 << XGL_SHADER_STAGE_GEOMETRY)
56#define SHADER_FRAGMENT_FLAG (1 << XGL_SHADER_STAGE_FRAGMENT)
57#define SHADER_COMPUTE_FLAG (1 << XGL_SHADER_STAGE_COMPUTE)
58
59/**
60 * 3D pipeline.
61 */
62struct intel_pipeline {
63 struct intel_obj obj;
64
65 struct intel_dev *dev;
66
67 struct intel_bo *workaround_bo;
68
69 uint32_t packed_sample_position_1x;
70 uint32_t packed_sample_position_4x;
71 uint32_t packed_sample_position_8x[2];
72
73 bool has_gen6_wa_pipe_control;
74
75 /* XGL IA_STATE */
Courtney Goeltzenleuchter42509992014-08-21 17:33:46 -060076 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -060077 int prim_type;
78 bool primitive_restart;
79 uint32_t primitive_restart_index;
80
81 /* Index of provoking vertex for each prim type */
82 int provoking_vertex_tri;
83 int provoking_vertex_trifan;
84 int provoking_vertex_line;
85
86 // TODO: This should probably be Intel HW state, not XGL state.
87 /* Depth Buffer format */
88 XGL_FORMAT db_format;
89
90 XGL_PIPELINE_CB_STATE cb_state;
91
92 // XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state;
93 bool depthClipEnable;
94 bool rasterizerDiscardEnable;
95 float pointSize;
96
97 XGL_PIPELINE_TESS_STATE_CREATE_INFO tess_state;
98 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO shader_state;
99
100 uint32_t active_shaders;
101 XGL_PIPELINE_SHADER vs;
102 XGL_PIPELINE_SHADER fs;
103 XGL_PIPELINE_SHADER gs;
104 XGL_PIPELINE_SHADER tess_control;
105 XGL_PIPELINE_SHADER tess_eval;
106 XGL_PIPELINE_SHADER compute;
107
Courtney Goeltzenleuchter42509992014-08-21 17:33:46 -0600108 XGL_SIZE total_size; // FB memory app needs to allocate for this pipeline
109
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600110 int reduced_prim;
111 int so_num_vertices, so_max_vertices;
112
113 uint32_t SF_VIEWPORT;
114 uint32_t CLIP_VIEWPORT;
115 uint32_t SF_CLIP_VIEWPORT; /* GEN7+ */
116 uint32_t CC_VIEWPORT;
117
118 uint32_t COLOR_CALC_STATE;
119 uint32_t BLEND_STATE;
120 uint32_t DEPTH_STENCIL_STATE;
121
122 uint32_t SCISSOR_RECT;
123
124 struct {
125 uint32_t BINDING_TABLE_STATE;
126 int BINDING_TABLE_STATE_size;
127 uint32_t SURFACE_STATE[INTEL_MAX_VS_SURFACES];
128 uint32_t SAMPLER_STATE;
129 uint32_t SAMPLER_BORDER_COLOR_STATE[INTEL_MAX_SAMPLERS];
130 uint32_t PUSH_CONSTANT_BUFFER;
131 int PUSH_CONSTANT_BUFFER_size;
132 } vs_state;
133
134 struct {
135 uint32_t BINDING_TABLE_STATE;
136 int BINDING_TABLE_STATE_size;
137 uint32_t SURFACE_STATE[INTEL_MAX_GS_SURFACES];
138 bool active;
139 } gs_state;
140
141 struct {
142 uint32_t BINDING_TABLE_STATE;
143 int BINDING_TABLE_STATE_size;
144 uint32_t SURFACE_STATE[INTEL_MAX_WM_SURFACES];
145 uint32_t SAMPLER_STATE;
146 uint32_t SAMPLER_BORDER_COLOR_STATE[INTEL_MAX_SAMPLERS];
147 uint32_t PUSH_CONSTANT_BUFFER;
148 int PUSH_CONSTANT_BUFFER_size;
149 } wm_state;
150};
151
152static inline struct intel_pipeline *intel_pipeline(XGL_PIPELINE pipeline)
153{
154 return (struct intel_pipeline *) pipeline;
155}
156
Courtney Goeltzenleuchter42509992014-08-21 17:33:46 -0600157static inline struct intel_pipeline *intel_pipeline_from_base(struct intel_base *base)
158{
159 return (struct intel_pipeline *) base;
160}
161
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600162static inline struct intel_pipeline *intel_pipeline_from_obj(struct intel_obj *obj)
163{
Courtney Goeltzenleuchter42509992014-08-21 17:33:46 -0600164 return intel_pipeline_from_base(&obj->base);
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600165}
166
167XGL_RESULT XGLAPI intelCreateGraphicsPipeline(
168 XGL_DEVICE device,
169 const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo,
170 XGL_PIPELINE* pPipeline);
171
172XGL_RESULT XGLAPI intelCreateComputePipeline(
173 XGL_DEVICE device,
174 const XGL_COMPUTE_PIPELINE_CREATE_INFO* pCreateInfo,
175 XGL_PIPELINE* pPipeline);
176
177XGL_RESULT XGLAPI intelStorePipeline(
178 XGL_PIPELINE pipeline,
179 XGL_SIZE* pDataSize,
180 XGL_VOID* pData);
181
182XGL_RESULT XGLAPI intelLoadPipeline(
183 XGL_DEVICE device,
184 XGL_SIZE dataSize,
185 const XGL_VOID* pData,
186 XGL_PIPELINE* pPipeline);
187
188XGL_RESULT XGLAPI intelCreatePipelineDelta(
189 XGL_DEVICE device,
190 XGL_PIPELINE p1,
191 XGL_PIPELINE p2,
192 XGL_PIPELINE_DELTA* delta);
193#endif // PIPELINE_H