| 1026 | |
| 1027 | |
| 1028 | VGLFBConfig getDefaultFBConfig(Display *dpy, int screen, VisualID vid) |
| 1029 | { |
| 1030 | if(!buildVisAttribTable(dpy, screen)) return NULL; |
| 1031 | GET_VA_TABLE() |
| 1032 | |
| 1033 | for(int i = 0; i < vaEntries; i++) |
| 1034 | { |
| 1035 | if(va[i].visualID == vid) |
| 1036 | { |
| 1037 | if(va[i].config) return va[i].config; |
| 1038 | |
| 1039 | if(va[i].glx.doubleBuffer < 0 || va[i].glx.alphaSize < 0 |
| 1040 | || va[i].glx.depthSize < 0 || va[i].glx.stencilSize < 0 |
| 1041 | || va[i].glx.samples < 0) |
| 1042 | return NULL; |
| 1043 | |
| 1044 | int glxattribs[] = { GLX_DOUBLEBUFFER, va[i].glx.doubleBuffer, |
| 1045 | GLX_RED_SIZE, 8, GLX_GREEN_SIZE, 8, GLX_BLUE_SIZE, 8, |
| 1046 | GLX_ALPHA_SIZE, va[i].glx.alphaSize, GLX_RENDER_TYPE, GLX_RGBA_BIT, |
| 1047 | GLX_STEREO, va[i].isStereo, |
| 1048 | GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT | |
| 1049 | (va[i].glx.samples ? 0 : GLX_PIXMAP_BIT) | GLX_WINDOW_BIT, |
| 1050 | GLX_X_VISUAL_TYPE, |
| 1051 | va[i].c_class == DirectColor ? GLX_DIRECT_COLOR : GLX_TRUE_COLOR, |
| 1052 | GLX_DEPTH_SIZE, va[i].glx.depthSize, |
| 1053 | GLX_STENCIL_SIZE, va[i].glx.stencilSize, |
| 1054 | GLX_SAMPLES, va[i].glx.samples, None }; |
| 1055 | if(va[i].depth == 30 || (va[i].depth == 32 && va[i].bpc == 10)) |
| 1056 | { |
| 1057 | glxattribs[3] = glxattribs[5] = glxattribs[7] = 10; |
| 1058 | } |
| 1059 | |
| 1060 | int n; |
| 1061 | VGLFBConfig *configs = chooseFBConfig(dpy, screen, glxattribs, n); |
| 1062 | if(configs) |
| 1063 | { |
| 1064 | // Make sure that the FB config actually has the requested |
| 1065 | // attributes, i.e. that its attributes are unique among the |
| 1066 | // list of visuals. Otherwise, skip it. |
| 1067 | int actualDB = getFBConfigAttrib(dpy, configs[0], GLX_DOUBLEBUFFER); |
| 1068 | int actualDepth = getFBConfigAttrib(dpy, configs[0], GLX_DEPTH_SIZE); |
| 1069 | |
| 1070 | if(configs[0]->attr.alphaSize >= 0 |
| 1071 | && !!configs[0]->attr.alphaSize == !!va[i].glx.alphaSize |
| 1072 | && !!actualDB == !!va[i].glx.doubleBuffer |
| 1073 | && configs[0]->attr.stencilSize >= 0 |
| 1074 | && !!configs[0]->attr.stencilSize == !!va[i].glx.stencilSize |
| 1075 | && !!actualDepth == !!va[i].glx.depthSize |
| 1076 | && configs[0]->attr.samples >= 0 |
| 1077 | && configs[0]->attr.samples == va[i].glx.samples) |
| 1078 | { |
| 1079 | if(fconfig.trace) |
| 1080 | vglout.println("[VGL] Visual 0x%.2x has default FB config 0x%.2x", |
| 1081 | (unsigned int)va[i].visualID, configs[0]->id); |
| 1082 | va[i].config = configs[0]; |
| 1083 | } |
| 1084 | _XFree(configs); |
| 1085 | } |
no test coverage detected