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"
29 #include "intel_chipset.h"
33 #include "ilo_blitter.h"
35 #include "ilo_gpgpu.h"
36 #include "ilo_query.h"
37 #include "ilo_resource.h"
38 #include "ilo_screen.h"
39 #include "ilo_shader.h"
40 #include "ilo_state.h"
41 #include "ilo_transfer.h"
42 #include "ilo_video.h"
43 #include "ilo_context.h"
46 ilo_context_cp_flushed(struct ilo_cp
*cp
, void *data
)
48 struct ilo_context
*ilo
= ilo_context(data
);
51 intel_bo_unreference(ilo
->last_cp_bo
);
53 /* remember the just flushed bo, on which fences could wait */
54 ilo
->last_cp_bo
= cp
->bo
;
55 intel_bo_reference(ilo
->last_cp_bo
);
57 ilo_3d_cp_flushed(ilo
->hw3d
);
61 ilo_flush(struct pipe_context
*pipe
,
62 struct pipe_fence_handle
**f
,
65 struct ilo_context
*ilo
= ilo_context(pipe
);
68 struct ilo_fence
*fence
;
70 fence
= CALLOC_STRUCT(ilo_fence
);
72 pipe_reference_init(&fence
->reference
, 1);
74 /* reference the batch bo that we want to wait on */
75 if (ilo_cp_empty(ilo
->cp
))
76 fence
->bo
= ilo
->last_cp_bo
;
78 fence
->bo
= ilo
->cp
->bo
;
81 intel_bo_reference(fence
->bo
);
84 *f
= (struct pipe_fence_handle
*) fence
;
88 (flags
& PIPE_FLUSH_END_OF_FRAME
) ? "frame end" : "user request");
92 ilo_context_destroy(struct pipe_context
*pipe
)
94 struct ilo_context
*ilo
= ilo_context(pipe
);
96 ilo_cleanup_states(ilo
);
99 intel_bo_unreference(ilo
->last_cp_bo
);
102 u_upload_destroy(ilo
->uploader
);
105 ilo_blitter_destroy(ilo
->blitter
);
107 ilo_3d_destroy(ilo
->hw3d
);
108 if (ilo
->shader_cache
)
109 ilo_shader_cache_destroy(ilo
->shader_cache
);
111 ilo_cp_destroy(ilo
->cp
);
113 util_slab_destroy(&ilo
->transfer_mempool
);
118 static struct pipe_context
*
119 ilo_context_create(struct pipe_screen
*screen
, void *priv
)
121 struct ilo_screen
*is
= ilo_screen(screen
);
122 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
);
138 ilo
->cp
= ilo_cp_create(ilo
->winsys
, is
->dev
.has_llc
);
139 ilo
->shader_cache
= ilo_shader_cache_create();
141 ilo
->hw3d
= ilo_3d_create(ilo
->cp
, ilo
->dev
);
143 if (!ilo
->cp
|| !ilo
->shader_cache
|| !ilo
->hw3d
) {
144 ilo_context_destroy(&ilo
->base
);
148 ilo
->uploader
= u_upload_create(&ilo
->base
, 1024 * 1024, 16,
149 PIPE_BIND_CONSTANT_BUFFER
| PIPE_BIND_INDEX_BUFFER
);
150 if (!ilo
->uploader
) {
151 ilo_context_destroy(&ilo
->base
);
155 ilo_cp_set_flush_callback(ilo
->cp
,
156 ilo_context_cp_flushed
, (void *) ilo
);
158 ilo
->base
.screen
= screen
;
159 ilo
->base
.priv
= priv
;
161 ilo
->base
.destroy
= ilo_context_destroy
;
162 ilo
->base
.flush
= ilo_flush
;
164 ilo_init_3d_functions(ilo
);
165 ilo_init_query_functions(ilo
);
166 ilo_init_state_functions(ilo
);
167 ilo_init_blit_functions(ilo
);
168 ilo_init_transfer_functions(ilo
);
169 ilo_init_video_functions(ilo
);
170 ilo_init_gpgpu_functions(ilo
);
172 ilo_init_states(ilo
);
174 /* this must be called last as u_blitter is a client of the pipe context */
175 ilo
->blitter
= ilo_blitter_create(ilo
);
177 ilo_context_destroy(&ilo
->base
);
185 * Initialize context-related functions.
188 ilo_init_context_functions(struct ilo_screen
*is
)
190 is
->base
.context_create
= ilo_context_create
;