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"
33 struct pipe_fence_handle
;
35 /* Not sure why the winsys needs this:
37 #define BRW_BATCH_SIZE (32*1024)
40 /* Need a tiny bit of information inside the abstract buffer struct:
42 struct brw_winsys_buffer
{
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.
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 */
63 /* Should be possible to validate usages above against buffer creation
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 */
82 struct brw_winsys_screen
{
93 struct brw_winsys_buffer
*(*bo_alloc
)( struct brw_winsys_screen
*sws
,
94 enum brw_buffer_type type
,
98 /* Reference and unreference buffers:
100 void (*bo_reference
)( struct brw_winsys_buffer
*buffer
);
101 void (*bo_unreference
)( struct brw_winsys_buffer
*buffer
);
103 /* delta -- added to b2->offset, and written into buffer
104 * offset -- location above value is written to within buffer
106 int (*bo_emit_reloc
)( struct brw_winsys_buffer
*buffer
,
107 enum brw_buffer_usage usage
,
110 struct brw_winsys_buffer
*b2
);
112 int (*bo_exec
)( struct brw_winsys_buffer
*buffer
,
113 unsigned bytes_used
);
115 int (*bo_subdata
)(struct brw_winsys_buffer
*buffer
,
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
);
124 /* XXX: couldn't this be handled by returning true/false on
127 enum pipe_error (*check_aperture_space
)( struct brw_winsys_screen
*iws
,
128 struct brw_winsys_buffer
**buffers
,
134 void *(*bo_map
)(struct brw_winsys_buffer
*buffer
,
140 void (*bo_unmap
)(struct brw_winsys_buffer
*buffer
);
147 * Destroy the winsys.
149 void (*destroy
)(struct brw_winsys_screen
*iws
);
154 * Create brw pipe_screen.
156 struct pipe_screen
*brw_create_screen(struct brw_winsys_screen
*iws
, unsigned pci_id
);
159 * Create a brw pipe_context.
161 struct pipe_context
*brw_create_context(struct pipe_screen
*screen
);
164 * Get the brw_winsys buffer backing the texture.
169 boolean
brw_texture_get_winsys_buffer(struct pipe_texture
*texture
,
170 struct brw_winsys_buffer
**buffer
,
174 * Wrap a brw_winsys buffer with a texture blanket.
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
);