| 102 | static void buildCfgAttribTable(Display *dpy, int screen); |
| 103 | |
| 104 | static void assignDefaultFBConfigAttribs(Display *dpy, int screen, |
| 105 | XVisualInfo *visuals, int nVisuals, int visualDepth, int visualClass, |
| 106 | int visualBPC, bool stereo, VisAttrib *va) |
| 107 | { |
| 108 | int alphaSize = -1, doubleBuffer = -1, stencilSize = -1, depthSize = -1, |
| 109 | numSamples = -1; |
| 110 | |
| 111 | if(nVisuals < 1) return; |
| 112 | |
| 113 | buildCfgAttribTable(dpy, screen); |
| 114 | GET_CA_TABLE() |
| 115 | |
| 116 | // Allow the default FB config attribs to be manually specified. |
| 117 | if(strlen(fconfig.defaultfbconfig) > 0) |
| 118 | { |
| 119 | char *str = strdup(fconfig.defaultfbconfig); |
| 120 | if(!str) THROW_UNIX(); |
| 121 | char *argv[512]; int argc = 0; |
| 122 | char *arg = strtok(str, ", \t"); |
| 123 | while(arg && argc < 512) |
| 124 | { |
| 125 | argv[argc] = arg; argc++; |
| 126 | arg = strtok(NULL, ", \t"); |
| 127 | } |
| 128 | for(int i = 0; i < argc; i++) |
| 129 | { |
| 130 | TEST_ATTRIB(GLX_ALPHA_SIZE, alphaSize, 0, INT_MAX); |
| 131 | TEST_ATTRIB(GLX_DOUBLEBUFFER, doubleBuffer, 0, 1); |
| 132 | TEST_ATTRIB(GLX_STENCIL_SIZE, stencilSize, 0, INT_MAX); |
| 133 | TEST_ATTRIB(GLX_DEPTH_SIZE, depthSize, 0, INT_MAX); |
| 134 | TEST_ATTRIB(GLX_SAMPLES, numSamples, 0, INT_MAX); |
| 135 | } |
| 136 | free(str); |
| 137 | } |
| 138 | |
| 139 | if(fconfig.samples >= 0) numSamples = fconfig.samples; |
| 140 | if(fconfig.forcealpha) alphaSize = 1; |
| 141 | |
| 142 | // Determine the range of values that the FB configs provide. |
| 143 | int minAlpha = INT_MAX, maxAlpha = 0, minDB = 0, maxDB = 1, |
| 144 | minStencil = INT_MAX, maxStencil = 0, minDepth = 24, maxDepth = 24, |
| 145 | minSamples = INT_MAX, maxSamples = 0; |
| 146 | for(int i = 0; i < caEntries; i++) |
| 147 | { |
| 148 | if(ca[i].attr.alphaSize < 0 || ca[i].attr.stencilSize < 0 |
| 149 | || ca[i].attr.samples < 0) |
| 150 | continue; |
| 151 | minAlpha = min(minAlpha, ca[i].attr.alphaSize); |
| 152 | maxAlpha = max(maxAlpha, ca[i].attr.alphaSize); |
| 153 | minStencil = min(minStencil, ca[i].attr.stencilSize); |
| 154 | maxStencil = max(maxStencil, ca[i].attr.stencilSize); |
| 155 | minSamples = min(minSamples, ca[i].attr.samples); |
| 156 | maxSamples = max(maxSamples, ca[i].attr.samples); |
| 157 | } |
| 158 | if(minAlpha < 0) minAlpha = 0; |
| 159 | minAlpha = !!minAlpha; maxAlpha = !!maxAlpha; |
| 160 | if(minStencil < 0) minStencil = 0; |
| 161 | minStencil = 8 * !!minStencil; maxStencil = 8 * !!maxStencil; |
no test coverage detected