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_blitter.h"
29 #include "intel_chipset.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 ilo->last_cp_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 ilo->last_cp_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 fence->bo->reference(fence->bo);
83 *f = (struct pipe_fence_handle *) fence;
86 ilo_cp_flush(ilo->cp);
90 ilo_context_destroy(struct pipe_context *pipe)
92 struct ilo_context *ilo = ilo_context(pipe);
94 ilo_cleanup_states(ilo);
97 ilo->last_cp_bo->unreference(ilo->last_cp_bo);
100 util_blitter_destroy(ilo->blitter);
102 ilo_3d_destroy(ilo->hw3d);
103 if (ilo->shader_cache)
104 ilo_shader_cache_destroy(ilo->shader_cache);
106 ilo_cp_destroy(ilo->cp);
111 static struct pipe_context *
112 ilo_context_create(struct pipe_screen *screen, void *priv)
114 struct ilo_screen *is = ilo_screen(screen);
115 struct ilo_context *ilo;
117 ilo = CALLOC_STRUCT(ilo_context);
121 ilo->winsys = is->winsys;
124 ilo->cp = ilo_cp_create(ilo->winsys, is->dev.has_llc);
125 ilo->shader_cache = ilo_shader_cache_create(ilo->winsys);
127 ilo->hw3d = ilo_3d_create(ilo->cp, ilo->dev);
129 if (!ilo->cp || !ilo->shader_cache || !ilo->hw3d) {
130 ilo_context_destroy(&ilo->base);
134 ilo_cp_set_flush_callback(ilo->cp,
135 ilo_context_cp_flushed, (void *) ilo);
137 ilo->dirty = ILO_DIRTY_ALL;
139 ilo->base.screen = screen;
140 ilo->base.priv = priv;
142 ilo->base.destroy = ilo_context_destroy;
143 ilo->base.flush = ilo_flush;
145 ilo_init_3d_functions(ilo);
146 ilo_init_query_functions(ilo);
147 ilo_init_state_functions(ilo);
148 ilo_init_blit_functions(ilo);
149 ilo_init_transfer_functions(ilo);
150 ilo_init_video_functions(ilo);
151 ilo_init_gpgpu_functions(ilo);
153 ilo_init_states(ilo);
155 /* this must be called last as u_blitter is a client of the pipe context */
156 ilo->blitter = util_blitter_create(&ilo->base);
158 ilo_context_destroy(&ilo->base);
166 * Initialize context-related functions.
169 ilo_init_context_functions(struct ilo_screen *is)
171 is->base.context_create = ilo_context_create;