2 * Mesa 3-D graphics library
4 * Copyright (C) 2012-2013 LunarG, Inc.
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:
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
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.
25 * Chia-I Wu <olv@lunarg.com>
28 #include "util/u_upload_mgr.h"
32 #include "ilo_blitter.h"
34 #include "ilo_gpgpu.h"
35 #include "ilo_query.h"
36 #include "ilo_resource.h"
37 #include "ilo_screen.h"
38 #include "ilo_shader.h"
39 #include "ilo_state.h"
40 #include "ilo_transfer.h"
41 #include "ilo_video.h"
42 #include "ilo_context.h"
45 ilo_context_cp_flushed(struct ilo_cp
*cp
, void *data
)
47 struct ilo_context
*ilo
= ilo_context(data
);
50 intel_bo_unreference(ilo
->last_cp_bo
);
52 /* remember the just flushed bo, on which fences could wait */
53 ilo
->last_cp_bo
= cp
->bo
;
54 intel_bo_reference(ilo
->last_cp_bo
);
56 ilo_3d_cp_flushed(ilo
->hw3d
);
60 ilo_flush(struct pipe_context
*pipe
,
61 struct pipe_fence_handle
**f
,
64 struct ilo_context
*ilo
= ilo_context(pipe
);
67 struct ilo_fence
*fence
;
69 fence
= CALLOC_STRUCT(ilo_fence
);
71 pipe_reference_init(&fence
->reference
, 1);
73 /* reference the batch bo that we want to wait on */
74 if (ilo_cp_empty(ilo
->cp
))
75 fence
->bo
= ilo
->last_cp_bo
;
77 fence
->bo
= ilo
->cp
->bo
;
80 intel_bo_reference(fence
->bo
);
83 *f
= (struct pipe_fence_handle
*) fence
;
87 (flags
& PIPE_FLUSH_END_OF_FRAME
) ? "frame end" : "user request");
91 ilo_context_destroy(struct pipe_context
*pipe
)
93 struct ilo_context
*ilo
= ilo_context(pipe
);
95 ilo_cleanup_states(ilo
);
98 intel_bo_unreference(ilo
->last_cp_bo
);
101 u_upload_destroy(ilo
->uploader
);
104 ilo_blitter_destroy(ilo
->blitter
);
106 ilo_3d_destroy(ilo
->hw3d
);
107 if (ilo
->shader_cache
)
108 ilo_shader_cache_destroy(ilo
->shader_cache
);
110 ilo_cp_destroy(ilo
->cp
);
112 util_slab_destroy(&ilo
->transfer_mempool
);
117 static struct pipe_context
*
118 ilo_context_create(struct pipe_screen
*screen
, void *priv
)
120 struct ilo_screen
*is
= ilo_screen(screen
);
121 struct ilo_context
*ilo
;
124 ilo
= CALLOC_STRUCT(ilo_context
);
128 ilo
->winsys
= is
->winsys
;
132 * initialize first, otherwise it may not be safe to call
133 * ilo_context_destroy() on errors
135 util_slab_create(&ilo
->transfer_mempool
,
136 sizeof(struct ilo_transfer
), 64, UTIL_SLAB_SINGLETHREADED
);
140 if (cp_size
* 4 > is
->dev
.max_batch_size
)
141 cp_size
= is
->dev
.max_batch_size
/ 4;
143 ilo
->cp
= ilo_cp_create(ilo
->winsys
, cp_size
, is
->dev
.has_llc
);
144 ilo
->shader_cache
= ilo_shader_cache_create();
146 ilo
->hw3d
= ilo_3d_create(ilo
->cp
, ilo
->dev
);
148 if (!ilo
->cp
|| !ilo
->shader_cache
|| !ilo
->hw3d
) {
149 ilo_context_destroy(&ilo
->base
);
153 ilo_cp_set_flush_callback(ilo
->cp
,
154 ilo_context_cp_flushed
, (void *) ilo
);
156 ilo
->base
.screen
= screen
;
157 ilo
->base
.priv
= priv
;
159 ilo
->base
.destroy
= ilo_context_destroy
;
160 ilo
->base
.flush
= ilo_flush
;
162 ilo_init_3d_functions(ilo
);
163 ilo_init_query_functions(ilo
);
164 ilo_init_state_functions(ilo
);
165 ilo_init_blit_functions(ilo
);
166 ilo_init_transfer_functions(ilo
);
167 ilo_init_video_functions(ilo
);
168 ilo_init_gpgpu_functions(ilo
);
170 ilo_init_states(ilo
);
173 * These must be called last as u_upload/u_blitter are clients of the pipe
176 ilo
->uploader
= u_upload_create(&ilo
->base
, 1024 * 1024, 16,
177 PIPE_BIND_CONSTANT_BUFFER
| PIPE_BIND_INDEX_BUFFER
);
178 if (!ilo
->uploader
) {
179 ilo_context_destroy(&ilo
->base
);
183 ilo
->blitter
= ilo_blitter_create(ilo
);
185 ilo_context_destroy(&ilo
->base
);
193 * Initialize context-related functions.
196 ilo_init_context_functions(struct ilo_screen
*is
)
198 is
->base
.context_create
= ilo_context_create
;