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 "intel_chipset.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
;
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 intel_bo_unreference(ilo
->last_cp_bo
);
99 util_slab_destroy(&ilo
->transfer_mempool
);
102 ilo_blitter_destroy(ilo
->blitter
);
104 ilo_3d_destroy(ilo
->hw3d
);
105 if (ilo
->shader_cache
)
106 ilo_shader_cache_destroy(ilo
->shader_cache
);
108 ilo_cp_destroy(ilo
->cp
);
113 static struct pipe_context
*
114 ilo_context_create(struct pipe_screen
*screen
, void *priv
)
116 struct ilo_screen
*is
= ilo_screen(screen
);
117 struct ilo_context
*ilo
;
119 ilo
= CALLOC_STRUCT(ilo_context
);
123 ilo
->winsys
= is
->winsys
;
126 ilo
->cp
= ilo_cp_create(ilo
->winsys
, is
->dev
.has_llc
);
127 ilo
->shader_cache
= ilo_shader_cache_create();
129 ilo
->hw3d
= ilo_3d_create(ilo
->cp
, ilo
->dev
);
131 if (!ilo
->cp
|| !ilo
->shader_cache
|| !ilo
->hw3d
) {
132 ilo_context_destroy(&ilo
->base
);
136 ilo_cp_set_flush_callback(ilo
->cp
,
137 ilo_context_cp_flushed
, (void *) ilo
);
139 util_slab_create(&ilo
->transfer_mempool
,
140 sizeof(struct ilo_transfer
), 64, UTIL_SLAB_SINGLETHREADED
);
142 ilo
->base
.screen
= screen
;
143 ilo
->base
.priv
= priv
;
145 ilo
->base
.destroy
= ilo_context_destroy
;
146 ilo
->base
.flush
= ilo_flush
;
148 ilo_init_3d_functions(ilo
);
149 ilo_init_query_functions(ilo
);
150 ilo_init_state_functions(ilo
);
151 ilo_init_blit_functions(ilo
);
152 ilo_init_transfer_functions(ilo
);
153 ilo_init_video_functions(ilo
);
154 ilo_init_gpgpu_functions(ilo
);
156 ilo_init_states(ilo
);
158 /* this must be called last as u_blitter is a client of the pipe context */
159 ilo
->blitter
= ilo_blitter_create(ilo
);
161 ilo_context_destroy(&ilo
->base
);
169 * Initialize context-related functions.
172 ilo_init_context_functions(struct ilo_screen
*is
)
174 is
->base
.context_create
= ilo_context_create
;