i965g: consolidate some includes
[mesa.git] / src / gallium / drivers / i965 / brw_winsys.h
1 /**************************************************************************
2 *
3 * Copyright © 2009 Jakob Bornecrantz
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
14 * 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
26 #ifndef BRW_WINSYS_H
27 #define BRW_WINSYS_H
28
29 #include "pipe/p_compiler.h"
30 #include "pipe/p_error.h"
31
32 struct brw_winsys;
33 struct pipe_fence_handle;
34
35 /* Not sure why the winsys needs this:
36 */
37 #define BRW_BATCH_SIZE (32*1024)
38
39
40 /* Need a tiny bit of information inside the abstract buffer struct:
41 */
42 struct brw_winsys_buffer {
43 unsigned *offset;
44 unsigned size;
45 };
46
47 /* Describe the usage of a particular buffer in a relocation. The DRM
48 * winsys will translate these back to GEM read/write domain flags.
49 */
50 enum brw_buffer_usage {
51 BRW_USAGE_STATE, /* INSTRUCTION, 0 */
52 BRW_USAGE_QUERY_RESULT, /* INSTRUCTION, INSTRUCTION */
53 BRW_USAGE_RENDER_TARGET, /* RENDER, 0 */
54 BRW_USAGE_DEPTH_BUFFER, /* RENDER, RENDER */
55 BRW_USAGE_BLIT_SOURCE, /* RENDER, 0 */
56 BRW_USAGE_BLIT_DEST, /* RENDER, RENDER */
57 BRW_USAGE_SAMPLER, /* SAMPLER, 0 */
58 BRW_USAGE_VERTEX, /* VERTEX, 0 */
59 BRW_USAGE_SCRATCH, /* 0, 0 */
60 BRW_USAGE_MAX
61 };
62
63 /* Should be possible to validate usages above against buffer creation
64 * types, below:
65 */
66 enum brw_buffer_type
67 {
68 BRW_BUFFER_TYPE_TEXTURE,
69 BRW_BUFFER_TYPE_SCANOUT, /**< a texture used for scanning out from */
70 BRW_BUFFER_TYPE_VERTEX,
71 BRW_BUFFER_TYPE_CURBE,
72 BRW_BUFFER_TYPE_QUERY,
73 BRW_BUFFER_TYPE_SHADER_CONSTANTS,
74 BRW_BUFFER_TYPE_SHADER_SCRATCH,
75 BRW_BUFFER_TYPE_BATCH,
76 BRW_BUFFER_TYPE_STATE_CACHE,
77 BRW_BUFFER_TYPE_PIXEL, /* image uploads, pbo's, etc */
78 BRW_BUFFER_TYPE_GENERIC, /* unknown */
79 BRW_BUFFER_TYPE_MAX /* Count of possible values */
80 };
81
82 struct brw_winsys_screen {
83
84
85 /**
86 * Buffer functions.
87 */
88
89 /*@{*/
90 /**
91 * Create a buffer.
92 */
93 struct brw_winsys_buffer *(*bo_alloc)( struct brw_winsys_screen *sws,
94 enum brw_buffer_type type,
95 unsigned size,
96 unsigned alignment );
97
98 /* Reference and unreference buffers:
99 */
100 void (*bo_reference)( struct brw_winsys_buffer *buffer );
101 void (*bo_unreference)( struct brw_winsys_buffer *buffer );
102
103 /* delta -- added to b2->offset, and written into buffer
104 * offset -- location above value is written to within buffer
105 */
106 int (*bo_emit_reloc)( struct brw_winsys_buffer *buffer,
107 enum brw_buffer_usage usage,
108 unsigned delta,
109 unsigned offset,
110 struct brw_winsys_buffer *b2);
111
112 int (*bo_exec)( struct brw_winsys_buffer *buffer,
113 unsigned bytes_used );
114
115 int (*bo_subdata)(struct brw_winsys_buffer *buffer,
116 size_t offset,
117 size_t size,
118 const void *data);
119
120 boolean (*bo_is_busy)(struct brw_winsys_buffer *buffer);
121 boolean (*bo_references)(struct brw_winsys_buffer *a,
122 struct brw_winsys_buffer *b);
123
124 /* XXX: couldn't this be handled by returning true/false on
125 * bo_emit_reloc?
126 */
127 enum pipe_error (*check_aperture_space)( struct brw_winsys_screen *iws,
128 struct brw_winsys_buffer **buffers,
129 unsigned count );
130
131 /**
132 * Map a buffer.
133 */
134 void *(*bo_map)(struct brw_winsys_buffer *buffer,
135 boolean write);
136
137 /**
138 * Unmap a buffer.
139 */
140 void (*bo_unmap)(struct brw_winsys_buffer *buffer);
141 /*@}*/
142
143
144
145
146 /**
147 * Destroy the winsys.
148 */
149 void (*destroy)(struct brw_winsys_screen *iws);
150 };
151
152
153 /**
154 * Create brw pipe_screen.
155 */
156 struct pipe_screen *brw_create_screen(struct brw_winsys_screen *iws, unsigned pci_id);
157
158 /**
159 * Create a brw pipe_context.
160 */
161 struct pipe_context *brw_create_context(struct pipe_screen *screen);
162
163 /**
164 * Get the brw_winsys buffer backing the texture.
165 *
166 * TODO UGLY
167 */
168 struct pipe_texture;
169 boolean brw_texture_get_winsys_buffer(struct pipe_texture *texture,
170 struct brw_winsys_buffer **buffer,
171 unsigned *stride);
172
173 /**
174 * Wrap a brw_winsys buffer with a texture blanket.
175 *
176 * TODO UGLY
177 */
178 struct pipe_texture *
179 brw_texture_blanket_winsys_buffer(struct pipe_screen *screen,
180 const struct pipe_texture *template,
181 const unsigned pitch,
182 struct brw_winsys_buffer *buffer);
183
184
185
186
187 #endif