xref: /aosp_15_r20/external/mesa3d/src/gallium/frontends/hgl/hgl.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2012-2014, Haiku, Inc. All Rights Reserved.
3*61046927SAndroid Build Coastguard Worker  * Distributed under the terms of the MIT License.
4*61046927SAndroid Build Coastguard Worker  *
5*61046927SAndroid Build Coastguard Worker  * Authors:
6*61046927SAndroid Build Coastguard Worker  *      Artur Wyszynski, [email protected]
7*61046927SAndroid Build Coastguard Worker  *      Alexander von Gluck IV, [email protected]
8*61046927SAndroid Build Coastguard Worker  */
9*61046927SAndroid Build Coastguard Worker 
10*61046927SAndroid Build Coastguard Worker #include "hgl_context.h"
11*61046927SAndroid Build Coastguard Worker 
12*61046927SAndroid Build Coastguard Worker #include <stdio.h>
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker #include "util/format/u_formats.h"
15*61046927SAndroid Build Coastguard Worker #include "util/u_atomic.h"
16*61046927SAndroid Build Coastguard Worker #include "util/format/u_format.h"
17*61046927SAndroid Build Coastguard Worker #include "util/u_memory.h"
18*61046927SAndroid Build Coastguard Worker #include "util/u_inlines.h"
19*61046927SAndroid Build Coastguard Worker #include "state_tracker/st_context.h"
20*61046927SAndroid Build Coastguard Worker 
21*61046927SAndroid Build Coastguard Worker 
22*61046927SAndroid Build Coastguard Worker #if MESA_DEBUG
23*61046927SAndroid Build Coastguard Worker #   define TRACE(x...) printf("hgl:frontend: " x)
24*61046927SAndroid Build Coastguard Worker #   define CALLED() TRACE("CALLED: %s\n", __PRETTY_FUNCTION__)
25*61046927SAndroid Build Coastguard Worker #else
26*61046927SAndroid Build Coastguard Worker #   define TRACE(x...)
27*61046927SAndroid Build Coastguard Worker #   define CALLED()
28*61046927SAndroid Build Coastguard Worker #endif
29*61046927SAndroid Build Coastguard Worker #define ERROR(x...) printf("hgl:frontend: " x)
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker // Perform a safe void to hgl_context cast
33*61046927SAndroid Build Coastguard Worker static inline struct hgl_context*
hgl_st_context(struct st_context * st)34*61046927SAndroid Build Coastguard Worker hgl_st_context(struct st_context *st)
35*61046927SAndroid Build Coastguard Worker {
36*61046927SAndroid Build Coastguard Worker 	struct hgl_context* context;
37*61046927SAndroid Build Coastguard Worker 	assert(st);
38*61046927SAndroid Build Coastguard Worker 	context = (struct hgl_context*)st->frontend_context;
39*61046927SAndroid Build Coastguard Worker 	assert(context);
40*61046927SAndroid Build Coastguard Worker 	return context;
41*61046927SAndroid Build Coastguard Worker }
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker // Perform a safe void to hgl_buffer cast
45*61046927SAndroid Build Coastguard Worker static struct hgl_buffer*
hgl_st_framebuffer(struct pipe_frontend_drawable * drawable)46*61046927SAndroid Build Coastguard Worker hgl_st_framebuffer(struct pipe_frontend_drawable *drawable)
47*61046927SAndroid Build Coastguard Worker {
48*61046927SAndroid Build Coastguard Worker 	struct hgl_buffer* buffer;
49*61046927SAndroid Build Coastguard Worker 	assert(drawable);
50*61046927SAndroid Build Coastguard Worker 	buffer = (struct hgl_buffer*)drawable;
51*61046927SAndroid Build Coastguard Worker 	assert(buffer);
52*61046927SAndroid Build Coastguard Worker 	return buffer;
53*61046927SAndroid Build Coastguard Worker }
54*61046927SAndroid Build Coastguard Worker 
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker static bool
hgl_st_framebuffer_flush_front(struct st_context * st,struct pipe_frontend_drawable * drawable,enum st_attachment_type statt)57*61046927SAndroid Build Coastguard Worker hgl_st_framebuffer_flush_front(struct st_context *st,
58*61046927SAndroid Build Coastguard Worker 	struct pipe_frontend_drawable* drawable, enum st_attachment_type statt)
59*61046927SAndroid Build Coastguard Worker {
60*61046927SAndroid Build Coastguard Worker 	CALLED();
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker 	struct hgl_buffer* buffer = hgl_st_framebuffer(drawable);
63*61046927SAndroid Build Coastguard Worker 	struct pipe_resource* ptex = buffer->textures[statt];
64*61046927SAndroid Build Coastguard Worker 
65*61046927SAndroid Build Coastguard Worker 	if (statt != ST_ATTACHMENT_FRONT_LEFT)
66*61046927SAndroid Build Coastguard Worker 		return false;
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker 	if (!ptex)
69*61046927SAndroid Build Coastguard Worker 		return true;
70*61046927SAndroid Build Coastguard Worker 
71*61046927SAndroid Build Coastguard Worker 	// TODO: pipe_context here??? Might be needed for hw renderers
72*61046927SAndroid Build Coastguard Worker 	buffer->screen->flush_frontbuffer(buffer->screen, NULL, ptex, 0, 0,
73*61046927SAndroid Build Coastguard Worker 		buffer->winsysContext, 0, NULL);
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker 	return true;
76*61046927SAndroid Build Coastguard Worker }
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker static bool
hgl_st_framebuffer_validate_textures(struct pipe_frontend_drawable * drawable,unsigned width,unsigned height,unsigned mask)80*61046927SAndroid Build Coastguard Worker hgl_st_framebuffer_validate_textures(struct pipe_frontend_drawable *drawable,
81*61046927SAndroid Build Coastguard Worker 	unsigned width, unsigned height, unsigned mask)
82*61046927SAndroid Build Coastguard Worker {
83*61046927SAndroid Build Coastguard Worker 	struct hgl_buffer* buffer;
84*61046927SAndroid Build Coastguard Worker 	enum st_attachment_type i;
85*61046927SAndroid Build Coastguard Worker 	struct pipe_resource templat;
86*61046927SAndroid Build Coastguard Worker 
87*61046927SAndroid Build Coastguard Worker 	CALLED();
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker 	buffer = hgl_st_framebuffer(drawable);
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker 	if (buffer->width != width || buffer->height != height) {
92*61046927SAndroid Build Coastguard Worker 		TRACE("validate_textures: size changed: %d, %d -> %d, %d\n",
93*61046927SAndroid Build Coastguard Worker 			buffer->width, buffer->height, width, height);
94*61046927SAndroid Build Coastguard Worker 		for (i = 0; i < ST_ATTACHMENT_COUNT; i++)
95*61046927SAndroid Build Coastguard Worker 			pipe_resource_reference(&buffer->textures[i], NULL);
96*61046927SAndroid Build Coastguard Worker 	}
97*61046927SAndroid Build Coastguard Worker 
98*61046927SAndroid Build Coastguard Worker 	memset(&templat, 0, sizeof(templat));
99*61046927SAndroid Build Coastguard Worker 	templat.target = buffer->target;
100*61046927SAndroid Build Coastguard Worker 	templat.width0 = width;
101*61046927SAndroid Build Coastguard Worker 	templat.height0 = height;
102*61046927SAndroid Build Coastguard Worker 	templat.depth0 = 1;
103*61046927SAndroid Build Coastguard Worker 	templat.array_size = 1;
104*61046927SAndroid Build Coastguard Worker 	templat.last_level = 0;
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker 	for (i = 0; i < ST_ATTACHMENT_COUNT; i++) {
107*61046927SAndroid Build Coastguard Worker 		enum pipe_format format;
108*61046927SAndroid Build Coastguard Worker 		unsigned bind;
109*61046927SAndroid Build Coastguard Worker 
110*61046927SAndroid Build Coastguard Worker 		if (((1 << i) & buffer->visual.buffer_mask) && buffer->textures[i] == NULL) {
111*61046927SAndroid Build Coastguard Worker 			switch (i) {
112*61046927SAndroid Build Coastguard Worker 				case ST_ATTACHMENT_FRONT_LEFT:
113*61046927SAndroid Build Coastguard Worker 				case ST_ATTACHMENT_BACK_LEFT:
114*61046927SAndroid Build Coastguard Worker 				case ST_ATTACHMENT_FRONT_RIGHT:
115*61046927SAndroid Build Coastguard Worker 				case ST_ATTACHMENT_BACK_RIGHT:
116*61046927SAndroid Build Coastguard Worker 					format = buffer->visual.color_format;
117*61046927SAndroid Build Coastguard Worker 					bind = PIPE_BIND_DISPLAY_TARGET | PIPE_BIND_RENDER_TARGET;
118*61046927SAndroid Build Coastguard Worker 					break;
119*61046927SAndroid Build Coastguard Worker 				case ST_ATTACHMENT_DEPTH_STENCIL:
120*61046927SAndroid Build Coastguard Worker 					format = buffer->visual.depth_stencil_format;
121*61046927SAndroid Build Coastguard Worker 					bind = PIPE_BIND_DEPTH_STENCIL;
122*61046927SAndroid Build Coastguard Worker 					break;
123*61046927SAndroid Build Coastguard Worker 				default:
124*61046927SAndroid Build Coastguard Worker 					format = PIPE_FORMAT_NONE;
125*61046927SAndroid Build Coastguard Worker 					bind = 0;
126*61046927SAndroid Build Coastguard Worker 					break;
127*61046927SAndroid Build Coastguard Worker 			}
128*61046927SAndroid Build Coastguard Worker 
129*61046927SAndroid Build Coastguard Worker 			if (format != PIPE_FORMAT_NONE) {
130*61046927SAndroid Build Coastguard Worker 				templat.format = format;
131*61046927SAndroid Build Coastguard Worker 				templat.bind = bind;
132*61046927SAndroid Build Coastguard Worker 				TRACE("resource_create(%d, %d, %d)\n", i, format, bind);
133*61046927SAndroid Build Coastguard Worker 				buffer->textures[i] = buffer->screen->resource_create(buffer->screen,
134*61046927SAndroid Build Coastguard Worker 					&templat);
135*61046927SAndroid Build Coastguard Worker 				if (!buffer->textures[i])
136*61046927SAndroid Build Coastguard Worker 					return false;
137*61046927SAndroid Build Coastguard Worker 			}
138*61046927SAndroid Build Coastguard Worker 		}
139*61046927SAndroid Build Coastguard Worker 	}
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker 	buffer->width = width;
142*61046927SAndroid Build Coastguard Worker 	buffer->height = height;
143*61046927SAndroid Build Coastguard Worker 	buffer->mask = mask;
144*61046927SAndroid Build Coastguard Worker 
145*61046927SAndroid Build Coastguard Worker 	return true;
146*61046927SAndroid Build Coastguard Worker }
147*61046927SAndroid Build Coastguard Worker 
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker /**
150*61046927SAndroid Build Coastguard Worker  * Called by the st manager to validate the framebuffer (allocate
151*61046927SAndroid Build Coastguard Worker  * its resources).
152*61046927SAndroid Build Coastguard Worker  */
153*61046927SAndroid Build Coastguard Worker static bool
hgl_st_framebuffer_validate(struct st_context * st,struct pipe_frontend_drawable * drawable,const enum st_attachment_type * statts,unsigned count,struct pipe_resource ** out,struct pipe_resource ** resolve)154*61046927SAndroid Build Coastguard Worker hgl_st_framebuffer_validate(struct st_context *st,
155*61046927SAndroid Build Coastguard Worker 	struct pipe_frontend_drawable *drawable, const enum st_attachment_type *statts,
156*61046927SAndroid Build Coastguard Worker 	unsigned count, struct pipe_resource **out, struct pipe_resource **resolve)
157*61046927SAndroid Build Coastguard Worker {
158*61046927SAndroid Build Coastguard Worker 	struct hgl_buffer* buffer;
159*61046927SAndroid Build Coastguard Worker 	unsigned stAttachmentMask, newMask;
160*61046927SAndroid Build Coastguard Worker 	unsigned i;
161*61046927SAndroid Build Coastguard Worker 	bool resized;
162*61046927SAndroid Build Coastguard Worker 
163*61046927SAndroid Build Coastguard Worker 	CALLED();
164*61046927SAndroid Build Coastguard Worker 
165*61046927SAndroid Build Coastguard Worker 	buffer = hgl_st_framebuffer(drawable);
166*61046927SAndroid Build Coastguard Worker 
167*61046927SAndroid Build Coastguard Worker 	// Build mask of current attachments
168*61046927SAndroid Build Coastguard Worker 	stAttachmentMask = 0;
169*61046927SAndroid Build Coastguard Worker 	for (i = 0; i < count; i++)
170*61046927SAndroid Build Coastguard Worker 		stAttachmentMask |= 1 << statts[i];
171*61046927SAndroid Build Coastguard Worker 
172*61046927SAndroid Build Coastguard Worker 	newMask = stAttachmentMask & ~buffer->mask;
173*61046927SAndroid Build Coastguard Worker 
174*61046927SAndroid Build Coastguard Worker 	resized = (buffer->width != buffer->newWidth)
175*61046927SAndroid Build Coastguard Worker 		|| (buffer->height != buffer->newHeight);
176*61046927SAndroid Build Coastguard Worker 
177*61046927SAndroid Build Coastguard Worker 	if (resized || newMask) {
178*61046927SAndroid Build Coastguard Worker 		bool ret;
179*61046927SAndroid Build Coastguard Worker 		TRACE("%s: resize event. old:  %d x %d; new: %d x %d\n", __func__,
180*61046927SAndroid Build Coastguard Worker 			buffer->width, buffer->height, buffer->newWidth, buffer->newHeight);
181*61046927SAndroid Build Coastguard Worker 
182*61046927SAndroid Build Coastguard Worker 		ret = hgl_st_framebuffer_validate_textures(drawable,
183*61046927SAndroid Build Coastguard Worker 			buffer->newWidth, buffer->newHeight, stAttachmentMask);
184*61046927SAndroid Build Coastguard Worker 
185*61046927SAndroid Build Coastguard Worker 		if (!ret)
186*61046927SAndroid Build Coastguard Worker 			return ret;
187*61046927SAndroid Build Coastguard Worker 	}
188*61046927SAndroid Build Coastguard Worker 
189*61046927SAndroid Build Coastguard Worker 	for (i = 0; i < count; i++)
190*61046927SAndroid Build Coastguard Worker 		pipe_resource_reference(&out[i], buffer->textures[statts[i]]);
191*61046927SAndroid Build Coastguard Worker 
192*61046927SAndroid Build Coastguard Worker 	return true;
193*61046927SAndroid Build Coastguard Worker }
194*61046927SAndroid Build Coastguard Worker 
195*61046927SAndroid Build Coastguard Worker 
196*61046927SAndroid Build Coastguard Worker static int
hgl_st_manager_get_param(struct pipe_frontend_screen * fscreen,enum st_manager_param param)197*61046927SAndroid Build Coastguard Worker hgl_st_manager_get_param(struct pipe_frontend_screen *fscreen, enum st_manager_param param)
198*61046927SAndroid Build Coastguard Worker {
199*61046927SAndroid Build Coastguard Worker 	CALLED();
200*61046927SAndroid Build Coastguard Worker 
201*61046927SAndroid Build Coastguard Worker 	switch (param) {
202*61046927SAndroid Build Coastguard Worker 		case ST_MANAGER_BROKEN_INVALIDATE:
203*61046927SAndroid Build Coastguard Worker 			return 1;
204*61046927SAndroid Build Coastguard Worker 	}
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker 	return 0;
207*61046927SAndroid Build Coastguard Worker }
208*61046927SAndroid Build Coastguard Worker 
209*61046927SAndroid Build Coastguard Worker 
210*61046927SAndroid Build Coastguard Worker static uint32_t hgl_fb_ID = 0;
211*61046927SAndroid Build Coastguard Worker 
212*61046927SAndroid Build Coastguard Worker /**
213*61046927SAndroid Build Coastguard Worker  * Create new framebuffer
214*61046927SAndroid Build Coastguard Worker  */
215*61046927SAndroid Build Coastguard Worker struct hgl_buffer *
hgl_create_st_framebuffer(struct hgl_display * display,struct st_visual * visual,void * winsysContext)216*61046927SAndroid Build Coastguard Worker hgl_create_st_framebuffer(struct hgl_display *display, struct st_visual* visual, void *winsysContext)
217*61046927SAndroid Build Coastguard Worker {
218*61046927SAndroid Build Coastguard Worker 	struct hgl_buffer *buffer;
219*61046927SAndroid Build Coastguard Worker 	CALLED();
220*61046927SAndroid Build Coastguard Worker 
221*61046927SAndroid Build Coastguard Worker 	// Our requires before creating a framebuffer
222*61046927SAndroid Build Coastguard Worker 	assert(display);
223*61046927SAndroid Build Coastguard Worker 	assert(visual);
224*61046927SAndroid Build Coastguard Worker 
225*61046927SAndroid Build Coastguard Worker 	buffer = CALLOC_STRUCT(hgl_buffer);
226*61046927SAndroid Build Coastguard Worker 	assert(buffer);
227*61046927SAndroid Build Coastguard Worker 
228*61046927SAndroid Build Coastguard Worker 	// Prepare our buffer
229*61046927SAndroid Build Coastguard Worker 	buffer->visual = *visual;
230*61046927SAndroid Build Coastguard Worker 	buffer->screen = display->fscreen->screen;
231*61046927SAndroid Build Coastguard Worker 	buffer->winsysContext = winsysContext;
232*61046927SAndroid Build Coastguard Worker 
233*61046927SAndroid Build Coastguard Worker 	if (buffer->screen->get_param(buffer->screen, PIPE_CAP_NPOT_TEXTURES))
234*61046927SAndroid Build Coastguard Worker 		buffer->target = PIPE_TEXTURE_2D;
235*61046927SAndroid Build Coastguard Worker 	else
236*61046927SAndroid Build Coastguard Worker 		buffer->target = PIPE_TEXTURE_RECT;
237*61046927SAndroid Build Coastguard Worker 
238*61046927SAndroid Build Coastguard Worker 	// Prepare our frontend interface
239*61046927SAndroid Build Coastguard Worker 	buffer->base.flush_front = hgl_st_framebuffer_flush_front;
240*61046927SAndroid Build Coastguard Worker 	buffer->base.validate = hgl_st_framebuffer_validate;
241*61046927SAndroid Build Coastguard Worker 	buffer->base.visual = &buffer->visual;
242*61046927SAndroid Build Coastguard Worker 
243*61046927SAndroid Build Coastguard Worker 	p_atomic_set(&buffer->base.stamp, 1);
244*61046927SAndroid Build Coastguard Worker 	buffer->base.ID = p_atomic_inc_return(&hgl_fb_ID);
245*61046927SAndroid Build Coastguard Worker 	buffer->base.fscreen = display->fscreen;
246*61046927SAndroid Build Coastguard Worker 
247*61046927SAndroid Build Coastguard Worker 	return buffer;
248*61046927SAndroid Build Coastguard Worker }
249*61046927SAndroid Build Coastguard Worker 
250*61046927SAndroid Build Coastguard Worker 
251*61046927SAndroid Build Coastguard Worker void
hgl_destroy_st_framebuffer(struct hgl_buffer * buffer)252*61046927SAndroid Build Coastguard Worker hgl_destroy_st_framebuffer(struct hgl_buffer *buffer)
253*61046927SAndroid Build Coastguard Worker {
254*61046927SAndroid Build Coastguard Worker 	CALLED();
255*61046927SAndroid Build Coastguard Worker 
256*61046927SAndroid Build Coastguard Worker 	int i;
257*61046927SAndroid Build Coastguard Worker 	for (i = 0; i < ST_ATTACHMENT_COUNT; i++)
258*61046927SAndroid Build Coastguard Worker 		pipe_resource_reference(&buffer->textures[i], NULL);
259*61046927SAndroid Build Coastguard Worker 
260*61046927SAndroid Build Coastguard Worker 	FREE(buffer);
261*61046927SAndroid Build Coastguard Worker }
262*61046927SAndroid Build Coastguard Worker 
263*61046927SAndroid Build Coastguard Worker 
264*61046927SAndroid Build Coastguard Worker struct hgl_context*
hgl_create_context(struct hgl_display * display,struct st_visual * visual,struct st_context * shared)265*61046927SAndroid Build Coastguard Worker hgl_create_context(struct hgl_display *display, struct st_visual* visual, struct st_context* shared)
266*61046927SAndroid Build Coastguard Worker {
267*61046927SAndroid Build Coastguard Worker 	struct hgl_context* context = CALLOC_STRUCT(hgl_context);
268*61046927SAndroid Build Coastguard Worker 	assert(context);
269*61046927SAndroid Build Coastguard Worker 	context->display = display;
270*61046927SAndroid Build Coastguard Worker 
271*61046927SAndroid Build Coastguard Worker 	struct st_context_attribs attribs;
272*61046927SAndroid Build Coastguard Worker 	memset(&attribs, 0, sizeof(attribs));
273*61046927SAndroid Build Coastguard Worker 	attribs.options.force_glsl_extensions_warn = false;
274*61046927SAndroid Build Coastguard Worker 	attribs.profile = API_OPENGL_COMPAT;
275*61046927SAndroid Build Coastguard Worker 	attribs.visual = *visual;
276*61046927SAndroid Build Coastguard Worker 	attribs.major = 1;
277*61046927SAndroid Build Coastguard Worker 	attribs.minor = 0;
278*61046927SAndroid Build Coastguard Worker 
279*61046927SAndroid Build Coastguard Worker 	enum st_context_error result;
280*61046927SAndroid Build Coastguard Worker 	context->st = st_api_create_context(display->fscreen, &attribs, &result, shared);
281*61046927SAndroid Build Coastguard Worker 	if (context->st == NULL) {
282*61046927SAndroid Build Coastguard Worker 		FREE(context);
283*61046927SAndroid Build Coastguard Worker 		return NULL;
284*61046927SAndroid Build Coastguard Worker 	}
285*61046927SAndroid Build Coastguard Worker 
286*61046927SAndroid Build Coastguard Worker 	assert(!context->st->frontend_context);
287*61046927SAndroid Build Coastguard Worker 	context->st->frontend_context = (void*)context;
288*61046927SAndroid Build Coastguard Worker 
289*61046927SAndroid Build Coastguard Worker 	struct st_context *stContext = (struct st_context*)context->st;
290*61046927SAndroid Build Coastguard Worker 
291*61046927SAndroid Build Coastguard Worker 	// Init Gallium3D Post Processing
292*61046927SAndroid Build Coastguard Worker 	// TODO: no pp filters are enabled yet through postProcessEnable
293*61046927SAndroid Build Coastguard Worker 	context->postProcess = pp_init(stContext->pipe, context->postProcessEnable, stContext->cso_context, stContext, (void*)st_context_invalidate_state);
294*61046927SAndroid Build Coastguard Worker 
295*61046927SAndroid Build Coastguard Worker 	return context;
296*61046927SAndroid Build Coastguard Worker }
297*61046927SAndroid Build Coastguard Worker 
298*61046927SAndroid Build Coastguard Worker 
299*61046927SAndroid Build Coastguard Worker void
hgl_destroy_context(struct hgl_context * context)300*61046927SAndroid Build Coastguard Worker hgl_destroy_context(struct hgl_context* context)
301*61046927SAndroid Build Coastguard Worker {
302*61046927SAndroid Build Coastguard Worker 	if (context->st) {
303*61046927SAndroid Build Coastguard Worker 		st_context_flush(context->st, 0, NULL, NULL, NULL);
304*61046927SAndroid Build Coastguard Worker 		st_destroy_context(context->st);
305*61046927SAndroid Build Coastguard Worker 	}
306*61046927SAndroid Build Coastguard Worker 
307*61046927SAndroid Build Coastguard Worker 	if (context->postProcess)
308*61046927SAndroid Build Coastguard Worker 		pp_free(context->postProcess);
309*61046927SAndroid Build Coastguard Worker 
310*61046927SAndroid Build Coastguard Worker 	FREE(context);
311*61046927SAndroid Build Coastguard Worker }
312*61046927SAndroid Build Coastguard Worker 
313*61046927SAndroid Build Coastguard Worker 
314*61046927SAndroid Build Coastguard Worker void
hgl_get_st_visual(struct st_visual * visual,ulong options)315*61046927SAndroid Build Coastguard Worker hgl_get_st_visual(struct st_visual* visual, ulong options)
316*61046927SAndroid Build Coastguard Worker {
317*61046927SAndroid Build Coastguard Worker 	CALLED();
318*61046927SAndroid Build Coastguard Worker 
319*61046927SAndroid Build Coastguard Worker 	assert(visual);
320*61046927SAndroid Build Coastguard Worker 
321*61046927SAndroid Build Coastguard Worker 	// Determine color format
322*61046927SAndroid Build Coastguard Worker 	if ((options & HGL_INDEX) != 0) {
323*61046927SAndroid Build Coastguard Worker 		// Index color
324*61046927SAndroid Build Coastguard Worker 		visual->color_format = PIPE_FORMAT_B5G6R5_UNORM;
325*61046927SAndroid Build Coastguard Worker 		// TODO: Indexed color depth buffer?
326*61046927SAndroid Build Coastguard Worker 		visual->depth_stencil_format = PIPE_FORMAT_NONE;
327*61046927SAndroid Build Coastguard Worker 	} else {
328*61046927SAndroid Build Coastguard Worker 		// RGB color
329*61046927SAndroid Build Coastguard Worker 		visual->color_format = (options & HGL_ALPHA)
330*61046927SAndroid Build Coastguard Worker 			? PIPE_FORMAT_BGRA8888_UNORM : PIPE_FORMAT_BGRX8888_UNORM;
331*61046927SAndroid Build Coastguard Worker 		// TODO: Determine additional stencil formats
332*61046927SAndroid Build Coastguard Worker 		visual->depth_stencil_format = (options & HGL_DEPTH)
333*61046927SAndroid Build Coastguard Worker 			? PIPE_FORMAT_Z24_UNORM_S8_UINT : PIPE_FORMAT_NONE;
334*61046927SAndroid Build Coastguard Worker     }
335*61046927SAndroid Build Coastguard Worker 
336*61046927SAndroid Build Coastguard Worker 	visual->accum_format = (options & HGL_ACCUM)
337*61046927SAndroid Build Coastguard Worker 		? PIPE_FORMAT_R16G16B16A16_SNORM : PIPE_FORMAT_NONE;
338*61046927SAndroid Build Coastguard Worker 
339*61046927SAndroid Build Coastguard Worker 	visual->buffer_mask |= ST_ATTACHMENT_FRONT_LEFT_MASK;
340*61046927SAndroid Build Coastguard Worker 
341*61046927SAndroid Build Coastguard Worker 	if ((options & HGL_DOUBLE) != 0) {
342*61046927SAndroid Build Coastguard Worker 		TRACE("double buffer enabled\n");
343*61046927SAndroid Build Coastguard Worker 		visual->buffer_mask |= ST_ATTACHMENT_BACK_LEFT_MASK;
344*61046927SAndroid Build Coastguard Worker 	}
345*61046927SAndroid Build Coastguard Worker 
346*61046927SAndroid Build Coastguard Worker #if 0
347*61046927SAndroid Build Coastguard Worker 	if ((options & HGL_STEREO) != 0) {
348*61046927SAndroid Build Coastguard Worker 		visual->buffer_mask |= ST_ATTACHMENT_FRONT_RIGHT_MASK;
349*61046927SAndroid Build Coastguard Worker 		if ((options & HGL_DOUBLE) != 0)
350*61046927SAndroid Build Coastguard Worker 			visual->buffer_mask |= ST_ATTACHMENT_BACK_RIGHT_MASK;
351*61046927SAndroid Build Coastguard Worker   }
352*61046927SAndroid Build Coastguard Worker #endif
353*61046927SAndroid Build Coastguard Worker 
354*61046927SAndroid Build Coastguard Worker 	if ((options & HGL_DEPTH) || (options & HGL_STENCIL))
355*61046927SAndroid Build Coastguard Worker 		visual->buffer_mask |= ST_ATTACHMENT_DEPTH_STENCIL_MASK;
356*61046927SAndroid Build Coastguard Worker 
357*61046927SAndroid Build Coastguard Worker 	TRACE("%s: Visual color format: %s\n", __func__,
358*61046927SAndroid Build Coastguard Worker 		util_format_name(visual->color_format));
359*61046927SAndroid Build Coastguard Worker }
360*61046927SAndroid Build Coastguard Worker 
361*61046927SAndroid Build Coastguard Worker 
362*61046927SAndroid Build Coastguard Worker struct hgl_display*
hgl_create_display(struct pipe_screen * screen)363*61046927SAndroid Build Coastguard Worker hgl_create_display(struct pipe_screen* screen)
364*61046927SAndroid Build Coastguard Worker {
365*61046927SAndroid Build Coastguard Worker 	struct hgl_display* display;
366*61046927SAndroid Build Coastguard Worker 
367*61046927SAndroid Build Coastguard Worker 	display = CALLOC_STRUCT(hgl_display);
368*61046927SAndroid Build Coastguard Worker 	assert(display);
369*61046927SAndroid Build Coastguard Worker 	display->fscreen = CALLOC_STRUCT(pipe_frontend_screen);
370*61046927SAndroid Build Coastguard Worker 	assert(display->fscreen);
371*61046927SAndroid Build Coastguard Worker 	display->fscreen->screen = screen;
372*61046927SAndroid Build Coastguard Worker 	display->fscreen->get_param = hgl_st_manager_get_param;
373*61046927SAndroid Build Coastguard Worker 	// display->fscreen->st_screen is used by llvmpipe
374*61046927SAndroid Build Coastguard Worker 
375*61046927SAndroid Build Coastguard Worker 	return display;
376*61046927SAndroid Build Coastguard Worker }
377*61046927SAndroid Build Coastguard Worker 
378*61046927SAndroid Build Coastguard Worker 
379*61046927SAndroid Build Coastguard Worker void
hgl_destroy_display(struct hgl_display * display)380*61046927SAndroid Build Coastguard Worker hgl_destroy_display(struct hgl_display *display)
381*61046927SAndroid Build Coastguard Worker {
382*61046927SAndroid Build Coastguard Worker 	st_screen_destroy(display->fscreen);
383*61046927SAndroid Build Coastguard Worker 	FREE(display->fscreen);
384*61046927SAndroid Build Coastguard Worker 	FREE(display);
385*61046927SAndroid Build Coastguard Worker }
386