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