aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/views
diff options
context:
space:
mode:
Diffstat (limited to 'src/views')
-rw-r--r--src/views/mac/SkNSView.h2
-rw-r--r--src/views/mac/SkNSView.mm44
-rw-r--r--src/views/mac/SkOSWindow_Mac.mm4
-rw-r--r--src/views/unix/SkOSWindow_Unix.cpp2
-rw-r--r--src/views/win/SkOSWindow_win.cpp110
5 files changed, 102 insertions, 60 deletions
diff --git a/src/views/mac/SkNSView.h b/src/views/mac/SkNSView.h
index 60727eb3e6..bf6e67c71c 100644
--- a/src/views/mac/SkNSView.h
+++ b/src/views/mac/SkNSView.h
@@ -42,7 +42,7 @@ class SkEvent;
- (void)postInvalWithRect:(const SkIRect*)rectOrNil;
- (BOOL)onHandleEvent:(const SkEvent&)event;
-- (bool)attach:(SkOSWindow::SkBackEndTypes)attachType;
+- (bool)attach:(SkOSWindow::SkBackEndTypes)attachType withMSAASampleCount:(int) sampleCount;
- (void)detach;
- (void)present;
@end
diff --git a/src/views/mac/SkNSView.mm b/src/views/mac/SkNSView.mm
index a6aa59cbef..9d52814afa 100644
--- a/src/views/mac/SkNSView.mm
+++ b/src/views/mac/SkNSView.mm
@@ -225,25 +225,36 @@ static SkKey raw2key(UInt32 raw)
///////////////////////////////////////////////////////////////////////////////
#include <OpenGL/OpenGL.h>
-CGLContextObj createGLContext() {
+namespace {
+CGLContextObj createGLContext(int msaaSampleCount) {
GLint major, minor;
CGLGetVersion(&major, &minor);
- const CGLPixelFormatAttribute attributes[] = {
+ static const CGLPixelFormatAttribute attributes[] = {
kCGLPFAStencilSize, (CGLPixelFormatAttribute)8,
-#if USE_MSAA
- kCGLPFASampleBuffers, 1,
- kCGLPFAMultisample,
- kCGLPFASamples, 8,
-#endif
kCGLPFAAccelerated,
kCGLPFADoubleBuffer,
(CGLPixelFormatAttribute)0
};
CGLPixelFormatObj format;
- GLint npix;
- CGLChoosePixelFormat(attributes, &format, &npix);
+ GLint npix = 0;
+ if (msaaSampleCount > 0) {
+ static int kAttributeCount = SK_ARRAY_COUNT(attributes);
+ CGLPixelFormatAttribute msaaAttributes[kAttributeCount + 5];
+ memcpy(msaaAttributes, attributes, sizeof(attributes));
+ SkASSERT(0 == msaaAttributes[kAttributeCount - 1]);
+ msaaAttributes[kAttributeCount - 1] = kCGLPFASampleBuffers;
+ msaaAttributes[kAttributeCount + 0] = (CGLPixelFormatAttribute)1;
+ msaaAttributes[kAttributeCount + 1] = kCGLPFAMultisample;
+ msaaAttributes[kAttributeCount + 2] = kCGLPFASamples;
+ msaaAttributes[kAttributeCount + 3] = (CGLPixelFormatAttribute)msaaSampleCount;
+ msaaAttributes[kAttributeCount + 4] = (CGLPixelFormatAttribute)0;
+ CGLChoosePixelFormat(msaaAttributes, &format, &npix);
+ }
+ if (!npix) {
+ CGLChoosePixelFormat(attributes, &format, &npix);
+ }
CGLContextObj ctx;
CGLCreateContext(format, NULL, &ctx);
@@ -254,6 +265,7 @@ CGLContextObj createGLContext() {
CGLSetCurrentContext(ctx);
return ctx;
}
+}
- (void)viewDidMoveToWindow {
[super viewDidMoveToWindow];
@@ -265,12 +277,15 @@ CGLContextObj createGLContext() {
[fGLContext setView:self];
}
}
-- (bool)attach:(SkOSWindow::SkBackEndTypes)attachType {
+- (bool)attach:(SkOSWindow::SkBackEndTypes)attachType withMSAASampleCount:(int) sampleCount {
if (nil == fGLContext) {
- fGLContext = [[NSOpenGLContext alloc] initWithCGLContextObj:createGLContext()];
+ CGLContextObj ctx = createGLContext(sampleCount);
+ fGLContext = [[NSOpenGLContext alloc] initWithCGLContextObj:ctx];
+ CGLReleaseContext(ctx);
if (NULL == fGLContext) {
return false;
}
+ [fGLContext setView:self];
}
[fGLContext makeCurrentContext];
@@ -283,10 +298,13 @@ CGLContextObj createGLContext() {
}
- (void)detach {
- [fGLContext clearDrawable];
+ [fGLContext release];
+ fGLContext = nil;
}
- (void)present {
- [fGLContext flushBuffer];
+ if (nil != fGLContext) {
+ [fGLContext flushBuffer];
+ }
}
@end
diff --git a/src/views/mac/SkOSWindow_Mac.mm b/src/views/mac/SkOSWindow_Mac.mm
index 4aa4eb5ff8..a5d3fef706 100644
--- a/src/views/mac/SkOSWindow_Mac.mm
+++ b/src/views/mac/SkOSWindow_Mac.mm
@@ -63,8 +63,8 @@ void SkOSWindow::onUpdateMenu(const SkOSMenu* menu) {
[(SkNSView*)fHWND onUpdateMenu:menu];
}
-bool SkOSWindow::attach(SkBackEndTypes attachType) {
- return [(SkNSView*)fHWND attach:attachType];
+bool SkOSWindow::attach(SkBackEndTypes attachType, int sampleCount) {
+ return [(SkNSView*)fHWND attach:attachType withMSAASampleCount:sampleCount];
}
void SkOSWindow::detach() {
diff --git a/src/views/unix/SkOSWindow_Unix.cpp b/src/views/unix/SkOSWindow_Unix.cpp
index 01bc21c89e..674ea624c1 100644
--- a/src/views/unix/SkOSWindow_Unix.cpp
+++ b/src/views/unix/SkOSWindow_Unix.cpp
@@ -170,7 +170,7 @@ void SkOSWindow::mapWindowAndWait()
}
-bool SkOSWindow::attach(SkBackEndTypes /* attachType */)
+bool SkOSWindow::attach(SkBackEndTypes /* attachType */, int msaaSampleCount)
{
if (fGLAttached) return true;
Display* dsp = fUnixWindow.fDisplay;
diff --git a/src/views/win/SkOSWindow_win.cpp b/src/views/win/SkOSWindow_win.cpp
index c6d345c062..ecd4c0cd03 100644
--- a/src/views/win/SkOSWindow_win.cpp
+++ b/src/views/win/SkOSWindow_win.cpp
@@ -313,7 +313,7 @@ void SkEvent::SignalQueueTimer(SkMSec delay)
#define USE_MSAA 0
-HGLRC create_gl(HWND hwnd) {
+HGLRC create_gl(HWND hwnd, int msaaSampleCount) {
HDC dc = GetDC(hwnd);
@@ -328,7 +328,7 @@ HGLRC create_gl(HWND hwnd) {
int format = 0;
- GLint iattrs[] = {
+ static const GLint iAttrs[] = {
SK_WGL_DRAW_TO_WINDOW, TRUE,
SK_WGL_DOUBLE_BUFFER, TRUE,
SK_WGL_ACCELERATION, SK_WGL_FULL_ACCELERATION,
@@ -336,40 +336,40 @@ HGLRC create_gl(HWND hwnd) {
SK_WGL_COLOR_BITS, 24,
SK_WGL_ALPHA_BITS, 8,
SK_WGL_STENCIL_BITS, 8,
-
- // these must be kept last
- SK_WGL_SAMPLE_BUFFERS, TRUE,
- SK_WGL_SAMPLES, 0,
- 0,0
+ 0, 0
};
- static const int kSampleBuffersValueIdx = SK_ARRAY_COUNT(iattrs) - 5;
- static const int kSamplesValueIdx = SK_ARRAY_COUNT(iattrs) - 3;
- if (USE_MSAA && extensions.hasExtension(dc, "WGL_ARB_multisample")) {
- for (int samples = 16; samples > 1; --samples) {
-
- iattrs[kSamplesValueIdx] = samples;
- GLfloat fattrs[] = {0,0};
- GLuint num;
- int formats[64];
- extensions.choosePixelFormat(dc, iattrs, fattrs, 64, formats, &num);
- num = min(num,64);
- for (GLuint i = 0; i < num; ++i) {
- DescribePixelFormat(dc, formats[i], sizeof(pfd), &pfd);
- if (SetPixelFormat(dc, formats[i], &pfd)) {
- format = formats[i];
- break;
- }
+ GLfloat fAttrs[] = {0, 0};
+
+ if (msaaSampleCount > 0 &&
+ extensions.hasExtension(dc, "WGL_ARB_multisample")) {
+ static const int kIAttrsCount = SK_ARRAY_COUNT(iAttrs);
+ GLint msaaIAttrs[kIAttrsCount + 4];
+ memcpy(msaaIAttrs, iAttrs, sizeof(GLint) * kIAttrsCount);
+ SkASSERT(0 == msaaIAttrs[kIAttrsCount - 2] &&
+ 0 == msaaIAttrs[kIAttrsCount - 1]);
+ msaaIAttrs[kIAttrsCount - 2] = SK_WGL_SAMPLE_BUFFERS;
+ msaaIAttrs[kIAttrsCount - 1] = TRUE;
+ msaaIAttrs[kIAttrsCount + 0] = SK_WGL_SAMPLES;
+ msaaIAttrs[kIAttrsCount + 1] = msaaSampleCount;
+ msaaIAttrs[kIAttrsCount + 2] = 0;
+ msaaIAttrs[kIAttrsCount + 3] = 0;
+ GLuint num;
+ int formats[64];
+ extensions.choosePixelFormat(dc, msaaIAttrs, fAttrs, 64, formats, &num);
+ num = min(num,64);
+ for (GLuint i = 0; i < num; ++i) {
+ DescribePixelFormat(dc, formats[i], sizeof(pfd), &pfd);
+ if (SetPixelFormat(dc, formats[i], &pfd)) {
+ format = formats[i];
+ break;
}
}
}
if (0 == format) {
- iattrs[kSampleBuffersValueIdx-1] = iattrs[kSampleBuffersValueIdx] = 0;
- iattrs[kSamplesValueIdx-1] = iattrs[kSamplesValueIdx] = 0;
- GLfloat fattrs[] = {0,0};
GLuint num;
- extensions.choosePixelFormat(dc, iattrs, fattrs, 1, &format, &num);
+ extensions.choosePixelFormat(dc, iAttrs, fAttrs, 1, &format, &num);
DescribePixelFormat(dc, format, sizeof(pfd), &pfd);
BOOL set = SetPixelFormat(dc, format, &pfd);
SkASSERT(TRUE == set);
@@ -382,9 +382,9 @@ HGLRC create_gl(HWND hwnd) {
return glrc;
}
-bool SkOSWindow::attachGL() {
+bool SkOSWindow::attachGL(int msaaSampleCount) {
if (NULL == fHGLRC) {
- fHGLRC = create_gl((HWND)fHWND);
+ fHGLRC = create_gl((HWND)fHWND, msaaSampleCount);
if (NULL == fHGLRC) {
return false;
}
@@ -413,13 +413,15 @@ void SkOSWindow::presentGL() {
}
#if SK_ANGLE
-bool create_ANGLE(EGLNativeWindowType hWnd, EGLDisplay* eglDisplay,
- EGLContext* eglContext, EGLSurface* eglSurface) {
- EGLint contextAttribs[] = {
- EGL_CONTEXT_CLIENT_VERSION, 2,
+bool create_ANGLE(EGLNativeWindowType hWnd,
+ int msaaSampleCount,
+ angle::EGLDisplay* eglDisplay,
+ angle::EGLContext* eglContext,
+ angle::EGLSurface* eglSurface) {
+ static EGLint contextAttribs[] = {
EGL_NONE, EGL_NONE
};
- EGLint configAttribList[] = {
+ static EGLint configAttribList[] = {
EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 8,
@@ -428,7 +430,7 @@ bool create_ANGLE(EGLNativeWindowType hWnd, EGLDisplay* eglDisplay,
EGL_STENCIL_SIZE, 8,
EGL_NONE
};
- EGLint surfaceAttribList[] = {
+ static EGLint surfaceAttribList[] = {
EGL_NONE, EGL_NONE
};
@@ -450,9 +452,31 @@ bool create_ANGLE(EGLNativeWindowType hWnd, EGLDisplay* eglDisplay,
// Choose config
EGLConfig config;
- if (!eglChooseConfig(display, configAttribList,
- &config, 1, &numConfigs)) {
- return false;
+ bool foundConfig = false;
+ if (msaaSampleCount) {
+ static int kConfigAttribListCnt = SK_ARRAY_COUNT(configAttribList);
+ EGLint msaaConfigAttribList[kConfigAttribListCnt + 4];
+ memcpy(msaaConfigAttribList,
+ configAttribList,
+ sizeof(configAttribList));
+ SkASSERT(EGL_NONE == msaaConfigAttribList[kConfigAttribListCnt - 1]);
+ msaaConfigAttribList[kConfigAttribListCnt - 1] = EGL_SAMPLE_BUFFERS;
+ msaaConfigAttribList[kConfigAttribListCnt + 0] = 1;
+ msaaConfigAttribList[kConfigAttribListCnt + 1] = EGL_SAMPLES;
+ msaaConfigAttribList[kConfigAttribListCnt + 2] = msaaCount;
+ msaaConfigAttribList[kConfigAttribListCnt + 3] = EGL_NONE;
+ if (eglChooseConfig(display, configAttribList,
+ &config, 1, &numConfigs)) {
+ if (numConfigs > 0) {
+ foundConfig = true;
+ }
+ }
+ }
+ if (!foundConfig) {
+ if (!eglChooseConfig(display, configAttribList,
+ &config, 1, &numConfigs)) {
+ return false;
+ }
}
// Create a surface
@@ -482,7 +506,7 @@ bool create_ANGLE(EGLNativeWindowType hWnd, EGLDisplay* eglDisplay,
return true;
}
-bool SkOSWindow::attachANGLE() {
+bool SkOSWindow::attachANGLE(int msaaSampleCount) {
if (EGL_NO_DISPLAY == fDisplay) {
bool bResult = create_ANGLE((HWND)fHWND, &fDisplay, &fContext, &fSurface);
if (false == bResult) {
@@ -640,7 +664,7 @@ void SkOSWindow::presentD3D9() {
}
// return true on success
-bool SkOSWindow::attach(SkBackEndTypes attachType) {
+bool SkOSWindow::attach(SkBackEndTypes attachType, int msaaSampleCount) {
// attach doubles as "windowResize" so we need to allo
// already bound states to pass through again
@@ -653,11 +677,11 @@ bool SkOSWindow::attach(SkBackEndTypes attachType) {
// nothing to do
break;
case kNativeGL_BackEndType:
- result = attachGL();
+ result = attachGL(msaaSampleCount);
break;
#if SK_ANGLE
case kANGLE_BackEndType:
- result = attachANGLE();
+ result = attachANGLE(msaaSampleCount);
break;
#endif
case kD3D9_BackEndType: