1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright 2019 Imagination Technologies.
3*61046927SAndroid Build Coastguard Worker * All Rights Reserved.
4*61046927SAndroid Build Coastguard Worker *
5*61046927SAndroid Build Coastguard Worker * Based on eglinfo, which has copyright:
6*61046927SAndroid Build Coastguard Worker * Copyright (C) 2005 Brian Paul All Rights Reserved.
7*61046927SAndroid Build Coastguard Worker *
8*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
9*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
10*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
11*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
13*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
14*61046927SAndroid Build Coastguard Worker *
15*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included
16*61046927SAndroid Build Coastguard Worker * in all copies or substantial portions of the Software.
17*61046927SAndroid Build Coastguard Worker *
18*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19*61046927SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21*61046927SAndroid Build Coastguard Worker * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22*61046927SAndroid Build Coastguard Worker * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23*61046927SAndroid Build Coastguard Worker * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24*61046927SAndroid Build Coastguard Worker */
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker #include <stdarg.h>
27*61046927SAndroid Build Coastguard Worker #include <stdio.h>
28*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
29*61046927SAndroid Build Coastguard Worker #include <string.h>
30*61046927SAndroid Build Coastguard Worker
31*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
32*61046927SAndroid Build Coastguard Worker #include "eglarray.h"
33*61046927SAndroid Build Coastguard Worker #include "eglconfig.h"
34*61046927SAndroid Build Coastguard Worker #include "eglconfigdebug.h"
35*61046927SAndroid Build Coastguard Worker #include "egldisplay.h"
36*61046927SAndroid Build Coastguard Worker #include "egllog.h"
37*61046927SAndroid Build Coastguard Worker #include "egltypedefs.h"
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker /* Max debug message length */
40*61046927SAndroid Build Coastguard Worker #define CONFIG_DEBUG_MSG_MAX 1000
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker /*
43*61046927SAndroid Build Coastguard Worker * These are X visual types, so if you're running eglinfo under
44*61046927SAndroid Build Coastguard Worker * something not X, they probably don't make sense.
45*61046927SAndroid Build Coastguard Worker */
46*61046927SAndroid Build Coastguard Worker static const char *const vnames[] = {"SG", "GS", "SC", "PC", "TC", "DC"};
47*61046927SAndroid Build Coastguard Worker
48*61046927SAndroid Build Coastguard Worker static void
_printHeaderFormat(void)49*61046927SAndroid Build Coastguard Worker _printHeaderFormat(void)
50*61046927SAndroid Build Coastguard Worker {
51*61046927SAndroid Build Coastguard Worker /*
52*61046927SAndroid Build Coastguard Worker * EGL configuration output legend:
53*61046927SAndroid Build Coastguard Worker *
54*61046927SAndroid Build Coastguard Worker * chosen --------------- eglChooseConfig returned config priority,
55*61046927SAndroid Build Coastguard Worker * only relevant when eglChooseConfig is called.
56*61046927SAndroid Build Coastguard Worker * id ------------------- EGL_CONFIG_ID
57*61046927SAndroid Build Coastguard Worker * bfsz ----------------- EGL_BUFFER_SIZE
58*61046927SAndroid Build Coastguard Worker * lvl ------------------ EGL_LEVEL
59*61046927SAndroid Build Coastguard Worker *
60*61046927SAndroid Build Coastguard Worker * colourbuffer
61*61046927SAndroid Build Coastguard Worker * r -------------------- EGL_RED_SIZE
62*61046927SAndroid Build Coastguard Worker * g -------------------- EGL_GREEN_SIZE
63*61046927SAndroid Build Coastguard Worker * b -------------------- EGL_BLUE_SIZE
64*61046927SAndroid Build Coastguard Worker * a -------------------- EGL_ALPHA_SIZE
65*61046927SAndroid Build Coastguard Worker * dpth ----------------- EGL_DEPTH_SIZE
66*61046927SAndroid Build Coastguard Worker * stcl ----------------- EGL_STENCIL_SIZE
67*61046927SAndroid Build Coastguard Worker *
68*61046927SAndroid Build Coastguard Worker * multisample
69*61046927SAndroid Build Coastguard Worker * ns ------------------- EGL_SAMPLES
70*61046927SAndroid Build Coastguard Worker * b -------------------- EGL_SAMPLE_BUFFERS
71*61046927SAndroid Build Coastguard Worker * visid ---------------- EGL_NATIVE_VISUAL_ID/EGL_NATIVE_VISUAL_TYPE
72*61046927SAndroid Build Coastguard Worker * caveat --------------- EGL_CONFIG_CAVEAT
73*61046927SAndroid Build Coastguard Worker * bind ----------------- EGL_BIND_TO_TEXTURE_RGB/EGL_BIND_TO_TEXTURE_RGBA
74*61046927SAndroid Build Coastguard Worker *
75*61046927SAndroid Build Coastguard Worker * renderable
76*61046927SAndroid Build Coastguard Worker * gl, es, es2, es3, vg - EGL_RENDERABLE_TYPE
77*61046927SAndroid Build Coastguard Worker *
78*61046927SAndroid Build Coastguard Worker * supported
79*61046927SAndroid Build Coastguard Worker * surfaces ------------- EGL_SURFACE_TYPE
80*61046927SAndroid Build Coastguard Worker */
81*61046927SAndroid Build Coastguard Worker /* clang-format off */
82*61046927SAndroid Build Coastguard Worker _eglLog(_EGL_DEBUG, "---------------");
83*61046927SAndroid Build Coastguard Worker _eglLog(_EGL_DEBUG, "Configurations:");
84*61046927SAndroid Build Coastguard Worker _eglLog(_EGL_DEBUG, "cho bf lv colourbuffer dp st ms vis cav bi renderable supported");
85*61046927SAndroid Build Coastguard Worker _eglLog(_EGL_DEBUG, "sen id sz l r g b a th cl ns b id eat nd gl es es2 es3 vg surfaces");
86*61046927SAndroid Build Coastguard Worker _eglLog(_EGL_DEBUG, "---------------");
87*61046927SAndroid Build Coastguard Worker /* clang-format on */
88*61046927SAndroid Build Coastguard Worker }
89*61046927SAndroid Build Coastguard Worker
90*61046927SAndroid Build Coastguard Worker /* Append a formatted string to the buffer, up to the buffer size */
91*61046927SAndroid Build Coastguard Worker static inline void
_strnAppend(char * const buf,const int bufSize,const char * fmt,...)92*61046927SAndroid Build Coastguard Worker _strnAppend(char *const buf, const int bufSize, const char *fmt, ...)
93*61046927SAndroid Build Coastguard Worker {
94*61046927SAndroid Build Coastguard Worker int maxAllowed;
95*61046927SAndroid Build Coastguard Worker va_list args;
96*61046927SAndroid Build Coastguard Worker size_t bufLen = strlen(buf);
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Worker maxAllowed = bufSize - bufLen;
99*61046927SAndroid Build Coastguard Worker assert(maxAllowed >= 0);
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard Worker va_start(args, fmt);
102*61046927SAndroid Build Coastguard Worker (void)vsnprintf(&buf[bufLen], maxAllowed, fmt, args);
103*61046927SAndroid Build Coastguard Worker va_end(args);
104*61046927SAndroid Build Coastguard Worker }
105*61046927SAndroid Build Coastguard Worker
106*61046927SAndroid Build Coastguard Worker static void
_eglPrintConfig(_EGLConfig * const conf,const int chosenIndex)107*61046927SAndroid Build Coastguard Worker _eglPrintConfig(_EGLConfig *const conf, const int chosenIndex)
108*61046927SAndroid Build Coastguard Worker {
109*61046927SAndroid Build Coastguard Worker const char padding[] = " ";
110*61046927SAndroid Build Coastguard Worker char printMsg[CONFIG_DEBUG_MSG_MAX] = "";
111*61046927SAndroid Build Coastguard Worker char surfString[32] = "";
112*61046927SAndroid Build Coastguard Worker EGLint renderable, surfaces, vtype, bindRgb, bindRgba;
113*61046927SAndroid Build Coastguard Worker
114*61046927SAndroid Build Coastguard Worker vtype = conf->NativeVisualType;
115*61046927SAndroid Build Coastguard Worker surfaces = conf->SurfaceType;
116*61046927SAndroid Build Coastguard Worker
117*61046927SAndroid Build Coastguard Worker STATIC_ASSERT(sizeof(surfString) >= sizeof("win,pb,pix,str,prsv"));
118*61046927SAndroid Build Coastguard Worker
119*61046927SAndroid Build Coastguard Worker if (surfaces & EGL_WINDOW_BIT)
120*61046927SAndroid Build Coastguard Worker strcat(surfString, "win,");
121*61046927SAndroid Build Coastguard Worker if (surfaces & EGL_PBUFFER_BIT)
122*61046927SAndroid Build Coastguard Worker strcat(surfString, "pb,");
123*61046927SAndroid Build Coastguard Worker if (surfaces & EGL_PIXMAP_BIT)
124*61046927SAndroid Build Coastguard Worker strcat(surfString, "pix,");
125*61046927SAndroid Build Coastguard Worker if (surfaces & EGL_STREAM_BIT_KHR)
126*61046927SAndroid Build Coastguard Worker strcat(surfString, "str,");
127*61046927SAndroid Build Coastguard Worker if (surfaces & EGL_SWAP_BEHAVIOR_PRESERVED_BIT)
128*61046927SAndroid Build Coastguard Worker strcat(surfString, "prsv");
129*61046927SAndroid Build Coastguard Worker
130*61046927SAndroid Build Coastguard Worker /* If one of chosen configs, print its index in the returned config array */
131*61046927SAndroid Build Coastguard Worker if (chosenIndex >= 0)
132*61046927SAndroid Build Coastguard Worker _strnAppend(printMsg, sizeof(printMsg), "%*d ", strlen(padding),
133*61046927SAndroid Build Coastguard Worker chosenIndex);
134*61046927SAndroid Build Coastguard Worker else
135*61046927SAndroid Build Coastguard Worker _strnAppend(printMsg, sizeof(printMsg), "%s ", &padding[0]);
136*61046927SAndroid Build Coastguard Worker
137*61046927SAndroid Build Coastguard Worker _strnAppend(printMsg, sizeof(printMsg),
138*61046927SAndroid Build Coastguard Worker "0x%03x %2d %2d %2d %2d %2d %2d %2d %2d %2d%2d 0x%08x%2s ",
139*61046927SAndroid Build Coastguard Worker conf->ConfigID, conf->BufferSize, conf->Level, conf->RedSize,
140*61046927SAndroid Build Coastguard Worker conf->GreenSize, conf->BlueSize, conf->AlphaSize,
141*61046927SAndroid Build Coastguard Worker conf->DepthSize, conf->StencilSize, conf->Samples,
142*61046927SAndroid Build Coastguard Worker conf->SampleBuffers, conf->NativeVisualID,
143*61046927SAndroid Build Coastguard Worker vtype < 6 ? vnames[vtype] : "--");
144*61046927SAndroid Build Coastguard Worker
145*61046927SAndroid Build Coastguard Worker bindRgb = conf->BindToTextureRGB;
146*61046927SAndroid Build Coastguard Worker bindRgba = conf->BindToTextureRGBA;
147*61046927SAndroid Build Coastguard Worker renderable = conf->RenderableType;
148*61046927SAndroid Build Coastguard Worker
149*61046927SAndroid Build Coastguard Worker _strnAppend(printMsg, sizeof(printMsg),
150*61046927SAndroid Build Coastguard Worker "%c %c %c %c %c %c %c %15s",
151*61046927SAndroid Build Coastguard Worker (conf->ConfigCaveat != EGL_NONE) ? 'y' : ' ',
152*61046927SAndroid Build Coastguard Worker (bindRgba) ? 'a'
153*61046927SAndroid Build Coastguard Worker : (bindRgb) ? 'y'
154*61046927SAndroid Build Coastguard Worker : ' ',
155*61046927SAndroid Build Coastguard Worker (renderable & EGL_OPENGL_BIT) ? 'y' : ' ',
156*61046927SAndroid Build Coastguard Worker (renderable & EGL_OPENGL_ES_BIT) ? 'y' : ' ',
157*61046927SAndroid Build Coastguard Worker (renderable & EGL_OPENGL_ES2_BIT) ? 'y' : ' ',
158*61046927SAndroid Build Coastguard Worker (renderable & EGL_OPENGL_ES3_BIT) ? 'y' : ' ',
159*61046927SAndroid Build Coastguard Worker (renderable & EGL_OPENVG_BIT) ? 'y' : ' ', surfString);
160*61046927SAndroid Build Coastguard Worker
161*61046927SAndroid Build Coastguard Worker _eglLog(_EGL_DEBUG, printMsg);
162*61046927SAndroid Build Coastguard Worker }
163*61046927SAndroid Build Coastguard Worker
164*61046927SAndroid Build Coastguard Worker void
eglPrintConfigDebug(const _EGLDisplay * const disp,const EGLConfig * const configs,const EGLint numConfigs,const EGLBoolean printChosen)165*61046927SAndroid Build Coastguard Worker eglPrintConfigDebug(const _EGLDisplay *const disp,
166*61046927SAndroid Build Coastguard Worker const EGLConfig *const configs, const EGLint numConfigs,
167*61046927SAndroid Build Coastguard Worker const EGLBoolean printChosen)
168*61046927SAndroid Build Coastguard Worker {
169*61046927SAndroid Build Coastguard Worker EGLint numConfigsToPrint;
170*61046927SAndroid Build Coastguard Worker _EGLConfig **configsToPrint;
171*61046927SAndroid Build Coastguard Worker _EGLConfig **chosenConfigs;
172*61046927SAndroid Build Coastguard Worker
173*61046927SAndroid Build Coastguard Worker if (!numConfigs || !configs) {
174*61046927SAndroid Build Coastguard Worker _eglLog(_EGL_DEBUG, "%s: nothing to print", __func__);
175*61046927SAndroid Build Coastguard Worker return;
176*61046927SAndroid Build Coastguard Worker }
177*61046927SAndroid Build Coastguard Worker
178*61046927SAndroid Build Coastguard Worker /*
179*61046927SAndroid Build Coastguard Worker * If the printout request came from the 'eglChooseConfig', all
180*61046927SAndroid Build Coastguard Worker * configs are printed, and the "chosen" configs are marked.
181*61046927SAndroid Build Coastguard Worker */
182*61046927SAndroid Build Coastguard Worker if (printChosen) {
183*61046927SAndroid Build Coastguard Worker configsToPrint = (_EGLConfig **)disp->Configs->Elements;
184*61046927SAndroid Build Coastguard Worker numConfigsToPrint = disp->Configs->Size;
185*61046927SAndroid Build Coastguard Worker chosenConfigs = (_EGLConfig **)configs;
186*61046927SAndroid Build Coastguard Worker } else {
187*61046927SAndroid Build Coastguard Worker configsToPrint = (_EGLConfig **)configs;
188*61046927SAndroid Build Coastguard Worker numConfigsToPrint = numConfigs;
189*61046927SAndroid Build Coastguard Worker chosenConfigs = NULL;
190*61046927SAndroid Build Coastguard Worker }
191*61046927SAndroid Build Coastguard Worker
192*61046927SAndroid Build Coastguard Worker _printHeaderFormat();
193*61046927SAndroid Build Coastguard Worker for (EGLint i = 0; i < numConfigsToPrint; i++) {
194*61046927SAndroid Build Coastguard Worker _EGLConfig *configToPrint = configsToPrint[i];
195*61046927SAndroid Build Coastguard Worker EGLint chosenIndex = -1;
196*61046927SAndroid Build Coastguard Worker
197*61046927SAndroid Build Coastguard Worker /* See if the current config to print is one of the chosen configs */
198*61046927SAndroid Build Coastguard Worker if (chosenConfigs)
199*61046927SAndroid Build Coastguard Worker for (EGLint j = 0; j < numConfigs; j++)
200*61046927SAndroid Build Coastguard Worker if (configToPrint == chosenConfigs[j])
201*61046927SAndroid Build Coastguard Worker chosenIndex = j;
202*61046927SAndroid Build Coastguard Worker
203*61046927SAndroid Build Coastguard Worker _eglPrintConfig(configToPrint, chosenIndex);
204*61046927SAndroid Build Coastguard Worker }
205*61046927SAndroid Build Coastguard Worker }
206