Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: src/views/unix/SkOSWindow_Unix.cpp

Issue 1410593002: Use common display initialization logic for Unix (Closed) Base URL: https://skia.googlesource.com/skia.git@vbnvpr
Patch Set: minor tidy Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 #include <X11/Xlib.h> 8 #include <X11/Xlib.h>
9 #include <X11/Xatom.h> 9 #include <X11/Xatom.h>
10 #include <X11/XKBlib.h> 10 #include <X11/XKBlib.h>
11 #include <GL/glx.h> 11 #include <GL/glx.h>
12 #include <GL/gl.h> 12 #include <GL/gl.h>
13 #include <GL/glu.h> 13 #include <GL/glu.h>
14 14
15 #include "SkWindow.h" 15 #include "SkWindow.h"
16 16
17 #include "gl/glx/GrNativeDisplay_glx.h"
18
17 #include "SkBitmap.h" 19 #include "SkBitmap.h"
18 #include "SkCanvas.h" 20 #include "SkCanvas.h"
19 #include "SkColor.h" 21 #include "SkColor.h"
20 #include "SkEvent.h" 22 #include "SkEvent.h"
21 #include "SkKey.h" 23 #include "SkKey.h"
22 #include "SkWindow.h" 24 #include "SkWindow.h"
23 #include "XkeysToSkKeys.h" 25 #include "XkeysToSkKeys.h"
24 extern "C" { 26 extern "C" {
25 #include "keysym2ucs.h" 27 #include "keysym2ucs.h"
26 } 28 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 } 77 }
76 } 78 }
77 return; 79 return;
78 } 80 }
79 fUnixWindow.fDisplay = XOpenDisplay(nullptr); 81 fUnixWindow.fDisplay = XOpenDisplay(nullptr);
80 Display* dsp = fUnixWindow.fDisplay; 82 Display* dsp = fUnixWindow.fDisplay;
81 if (nullptr == dsp) { 83 if (nullptr == dsp) {
82 SkDebugf("Could not open an X Display"); 84 SkDebugf("Could not open an X Display");
83 return; 85 return;
84 } 86 }
85 // Attempt to create a window that supports GL 87
robertphillips 2015/10/16 14:54:40 static const int attrs[] ?
86 GLint att[] = { 88 int att[] = {
87 GLX_RGBA,
88 GLX_DEPTH_SIZE, 24, 89 GLX_DEPTH_SIZE, 24,
89 GLX_DOUBLEBUFFER, 90 GLX_DOUBLEBUFFER, true,
robertphillips 2015/10/16 14:54:40 Don't we need these stencil settings in the other
90 GLX_STENCIL_SIZE, 8, 91 GLX_STENCIL_SIZE, 8,
91 None 92 None
92 }; 93 };
93 SkASSERT(nullptr == fVi);
94 if (requestedMSAASampleCount > 0) {
95 static const GLint kAttCount = SK_ARRAY_COUNT(att);
96 GLint msaaAtt[kAttCount + 4];
97 memcpy(msaaAtt, att, sizeof(att));
98 SkASSERT(None == msaaAtt[kAttCount - 1]);
99 msaaAtt[kAttCount - 1] = GLX_SAMPLE_BUFFERS_ARB;
100 msaaAtt[kAttCount + 0] = 1;
101 msaaAtt[kAttCount + 1] = GLX_SAMPLES_ARB;
102 msaaAtt[kAttCount + 2] = requestedMSAASampleCount;
103 msaaAtt[kAttCount + 3] = None;
104 fVi = glXChooseVisual(dsp, DefaultScreen(dsp), msaaAtt);
105 fMSAASampleCount = requestedMSAASampleCount;
106 }
107 if (nullptr == fVi) {
108 fVi = glXChooseVisual(dsp, DefaultScreen(dsp), att);
109 fMSAASampleCount = 0;
110 }
111 94
112 if (fVi) { 95 GLXFBConfig bestFbConfig;
96 if (!GrNativeDisplay::Initialize(att, fUnixWindow.fDisplay, &bestFbConfig)) {
113 if (info) { 97 if (info) {
114 glXGetConfig(dsp, fVi, GLX_SAMPLES_ARB, &info->fSampleCount); 98 info->fSampleCount = 0;
99 info->fStencilBits = 0;
100 }
101 // Create a simple window instead. We will not be able to show GL
102 fUnixWindow.fWin = XCreateSimpleWindow(dsp,
103 DefaultRootWindow(dsp),
104 0, 0, // x, y
105 WIDTH, HEIGHT,
106 0, // border width
107 0, // border value
108 0); // background value
109 } else {
110 glXGetConfig(dsp, fVi, GLX_SAMPLES_ARB, &fMSAASampleCount);
111 if (fMSAASampleCount < requestedMSAASampleCount) {
112 SkDebugf("Requested samples exceeds the maximum allowed on this plat form\n");
113 }
114
115 if (info) {
robertphillips 2015/10/16 14:54:40 Shouldn't this be requestedMSAASampleCount ?
116 info->fSampleCount = fMSAASampleCount;
115 glXGetConfig(dsp, fVi, GLX_STENCIL_SIZE, &info->fStencilBits); 117 glXGetConfig(dsp, fVi, GLX_STENCIL_SIZE, &info->fStencilBits);
116 } 118 }
119
120 fVi = glXGetVisualFromFBConfig(fUnixWindow.fDisplay, bestFbConfig);
121 SkASSERT(fVi);
122
117 Colormap colorMap = XCreateColormap(dsp, 123 Colormap colorMap = XCreateColormap(dsp,
118 RootWindow(dsp, fVi->screen), 124 RootWindow(dsp, fVi->screen),
119 fVi->visual, 125 fVi->visual,
120 AllocNone); 126 AllocNone);
121 XSetWindowAttributes swa; 127 XSetWindowAttributes swa;
122 swa.colormap = colorMap; 128 swa.colormap = colorMap;
123 swa.event_mask = EVENT_MASK; 129 swa.event_mask = EVENT_MASK;
124 fUnixWindow.fWin = XCreateWindow(dsp, 130 fUnixWindow.fWin = XCreateWindow(dsp,
125 RootWindow(dsp, fVi->screen), 131 RootWindow(dsp, fVi->screen),
126 0, 0, // x, y 132 0, 0, // x, y
127 WIDTH, HEIGHT, 133 WIDTH, HEIGHT,
128 0, // border width 134 0, // border width
129 fVi->depth, 135 fVi->depth,
130 InputOutput, 136 InputOutput,
131 fVi->visual, 137 fVi->visual,
132 CWEventMask | CWColormap, 138 CWEventMask | CWColormap,
133 &swa); 139 &swa);
134 } else { 140
135 if (info) {
136 info->fSampleCount = 0;
137 info->fStencilBits = 0;
138 }
139 // Create a simple window instead. We will not be able to show GL
140 fUnixWindow.fWin = XCreateSimpleWindow(dsp,
141 DefaultRootWindow(dsp),
142 0, 0, // x, y
143 WIDTH, HEIGHT,
144 0, // border width
145 0, // border value
146 0); // background value
147 } 141 }
142
148 this->mapWindowAndWait(); 143 this->mapWindowAndWait();
149 fUnixWindow.fGc = XCreateGC(dsp, fUnixWindow.fWin, 0, nullptr); 144 fUnixWindow.fGc = XCreateGC(dsp, fUnixWindow.fWin, 0, nullptr);
150 } 145 }
151 146
152 static unsigned getModi(const XEvent& evt) { 147 static unsigned getModi(const XEvent& evt) {
153 static const struct { 148 static const struct {
154 unsigned fXMask; 149 unsigned fXMask;
155 unsigned fSkMask; 150 unsigned fSkMask;
156 } gModi[] = { 151 } gModi[] = {
157 // X values found by experiment. Is there a better way? 152 // X values found by experiment. Is there a better way?
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 505
511 void SkEvent::SignalNonEmptyQueue() { 506 void SkEvent::SignalNonEmptyQueue() {
512 // nothing to do, since we spin on our event-queue, polling for XPending 507 // nothing to do, since we spin on our event-queue, polling for XPending
513 } 508 }
514 509
515 void SkEvent::SignalQueueTimer(SkMSec delay) { 510 void SkEvent::SignalQueueTimer(SkMSec delay) {
516 // just need to record the delay time. We handle waking up for it in 511 // just need to record the delay time. We handle waking up for it in
517 // MyXNextEventWithDelay() 512 // MyXNextEventWithDelay()
518 gTimerDelay = delay; 513 gTimerDelay = delay;
519 } 514 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698