1 /**************************************************************************
3 * Copyright © 2009 Jakob Bornecrantz
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:
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
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.
24 **************************************************************************/
29 #include "pipe/p_compiler.h"
30 #include "pipe/p_error.h"
31 #include "pipe/p_refcnt.h"
34 struct pipe_fence_handle
;
36 /* Not sure why the winsys needs this:
38 #define BRW_BATCH_SIZE (32*1024)
40 struct brw_winsys_screen
;
42 /* Need a tiny bit of information inside the abstract buffer struct:
44 struct brw_winsys_buffer
{
45 struct pipe_reference reference
;
46 struct brw_winsys_screen
*sws
;
51 /* Should be possible to validate usages above against buffer creation
56 BRW_BUFFER_TYPE_TEXTURE
,
57 BRW_BUFFER_TYPE_SCANOUT
, /**< a texture used for scanning out from */
58 BRW_BUFFER_TYPE_VERTEX
,
59 BRW_BUFFER_TYPE_CURBE
,
60 BRW_BUFFER_TYPE_QUERY
,
61 BRW_BUFFER_TYPE_SHADER_CONSTANTS
,
62 BRW_BUFFER_TYPE_SHADER_SCRATCH
,
63 BRW_BUFFER_TYPE_BATCH
,
64 BRW_BUFFER_TYPE_GENERAL_STATE
,
65 BRW_BUFFER_TYPE_SURFACE_STATE
,
66 BRW_BUFFER_TYPE_PIXEL
, /* image uploads, pbo's, etc */
67 BRW_BUFFER_TYPE_GENERIC
, /* unknown */
68 BRW_BUFFER_TYPE_MAX
/* Count of possible values */
72 /* Describe the usage of a particular buffer in a relocation. The DRM
73 * winsys will translate these back to GEM read/write domain flags.
75 enum brw_buffer_usage
{
76 BRW_USAGE_STATE
, /* INSTRUCTION, 0 */
77 BRW_USAGE_QUERY_RESULT
, /* INSTRUCTION, INSTRUCTION */
78 BRW_USAGE_RENDER_TARGET
, /* RENDER, 0 */
79 BRW_USAGE_DEPTH_BUFFER
, /* RENDER, RENDER */
80 BRW_USAGE_BLIT_SOURCE
, /* RENDER, 0 */
81 BRW_USAGE_BLIT_DEST
, /* RENDER, RENDER */
82 BRW_USAGE_SAMPLER
, /* SAMPLER, 0 */
83 BRW_USAGE_VERTEX
, /* VERTEX, 0 */
84 BRW_USAGE_SCRATCH
, /* 0, 0 */
88 enum brw_buffer_data_type
{
92 BRW_DATA_GS_SAMPLER_DEFAULT_COLOR
,
103 BRW_DATA_GS_CLIP_UNIT
,
104 BRW_DATA_GS_CLIP_PROG
,
106 BRW_DATA_SS_SURF_BIND
,
107 BRW_DATA_CONSTANT_BUFFER
,
108 BRW_DATA_BATCH_BUFFER
,
114 /* Relocations to be applied with subdata in a call to sws->bo_subdata, below.
116 * Effectively this encodes:
118 * (unsigned *)(subdata + offset) = bo->offset + delta
120 struct brw_winsys_reloc
{
121 enum brw_buffer_usage usage
; /* debug only */
124 struct brw_winsys_buffer
*bo
;
127 static INLINE
void make_reloc(struct brw_winsys_reloc
*reloc
,
128 enum brw_buffer_usage usage
,
131 struct brw_winsys_buffer
*bo
)
133 reloc
->usage
= usage
;
134 reloc
->delta
= delta
;
135 reloc
->offset
= offset
;
136 reloc
->bo
= bo
; /* Note - note taking a reference yet */
141 struct brw_winsys_screen
{
152 enum pipe_error (*bo_alloc
)(struct brw_winsys_screen
*sws
,
153 enum brw_buffer_type type
,
156 struct brw_winsys_buffer
**bo_out
);
158 /* Destroy a buffer when our refcount goes to zero:
160 void (*bo_destroy
)(struct brw_winsys_buffer
*buffer
);
162 /* delta -- added to b2->offset, and written into buffer
163 * offset -- location above value is written to within buffer
165 enum pipe_error (*bo_emit_reloc
)(struct brw_winsys_buffer
*buffer
,
166 enum brw_buffer_usage usage
,
169 struct brw_winsys_buffer
*b2
);
171 enum pipe_error (*bo_exec
)(struct brw_winsys_buffer
*buffer
,
172 unsigned bytes_used
);
174 enum pipe_error (*bo_subdata
)(struct brw_winsys_buffer
*buffer
,
175 enum brw_buffer_data_type data_type
,
179 const struct brw_winsys_reloc
*reloc
,
182 boolean (*bo_is_busy
)(struct brw_winsys_buffer
*buffer
);
183 boolean (*bo_references
)(struct brw_winsys_buffer
*a
,
184 struct brw_winsys_buffer
*b
);
186 /* XXX: couldn't this be handled by returning true/false on
189 enum pipe_error (*check_aperture_space
)(struct brw_winsys_screen
*iws
,
190 struct brw_winsys_buffer
**buffers
,
196 void *(*bo_map
)(struct brw_winsys_buffer
*buffer
,
197 enum brw_buffer_data_type data_type
,
202 boolean flush_explicit
);
204 void (*bo_flush_range
)(struct brw_winsys_buffer
*buffer
,
211 void (*bo_unmap
)(struct brw_winsys_buffer
*buffer
);
215 /* Wait for buffer to go idle. Similar to map+unmap, but doesn't
216 * mark buffer contents as dirty.
218 void (*bo_wait_idle
)(struct brw_winsys_buffer
*buffer
);
221 * Destroy the winsys.
223 void (*destroy
)(struct brw_winsys_screen
*iws
);
227 bo_map_read(struct brw_winsys_screen
*sws
, struct brw_winsys_buffer
*buf
)
229 return sws
->bo_map( buf
,
232 FALSE
, FALSE
, FALSE
);
236 bo_reference(struct brw_winsys_buffer
**ptr
, struct brw_winsys_buffer
*buf
)
238 struct brw_winsys_buffer
*old_buf
= *ptr
;
240 if (pipe_reference((struct pipe_reference
**)ptr
, &buf
->reference
))
241 old_buf
->sws
->bo_destroy(old_buf
);
246 * Create brw pipe_screen.
248 struct pipe_screen
*brw_create_screen(struct brw_winsys_screen
*iws
, unsigned pci_id
);
251 * Create a brw pipe_context.
253 struct pipe_context
*brw_create_context(struct pipe_screen
*screen
);
256 * Get the brw_winsys buffer backing the texture.
261 boolean
brw_texture_get_winsys_buffer(struct pipe_texture
*texture
,
262 struct brw_winsys_buffer
**buffer
,
266 * Wrap a brw_winsys buffer with a texture blanket.
270 struct pipe_texture
*
271 brw_texture_blanket_winsys_buffer(struct pipe_screen
*screen
,
272 const struct pipe_texture
*template,
273 const unsigned pitch
,
274 struct brw_winsys_buffer
*buffer
);