diff options
author | bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-04-03 18:03:03 +0000 |
---|---|---|
committer | bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-04-03 18:03:03 +0000 |
commit | 5f017a4ab001baf1b9f433a9b02c6e01f93a97a1 (patch) | |
tree | fd7fa56d58f333f65cde7db61ec3944206d49384 /src | |
parent | 86bb9b73a00d16eb13a6db13c5d2f775040caf13 (diff) |
Fix GL attach/detach in Mac SampleApp
Review URL: http://codereview.appspot.com/5984043/
git-svn-id: http://skia.googlecode.com/svn/trunk@3587 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r-- | src/gpu/GrContext.cpp | 11 | ||||
-rw-r--r-- | src/gpu/gl/GrGpuGL.cpp | 12 | ||||
-rw-r--r-- | src/views/mac/SkNSView.h | 2 | ||||
-rw-r--r-- | src/views/mac/SkNSView.mm | 44 | ||||
-rw-r--r-- | src/views/mac/SkOSWindow_Mac.mm | 4 | ||||
-rw-r--r-- | src/views/unix/SkOSWindow_Unix.cpp | 2 | ||||
-rw-r--r-- | src/views/win/SkOSWindow_win.cpp | 110 |
7 files changed, 112 insertions, 73 deletions
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp index 4b3d942d61..7589da9050 100644 --- a/src/gpu/GrContext.cpp +++ b/src/gpu/GrContext.cpp @@ -22,11 +22,11 @@ #include "SkTLazy.h" #include "SkTrace.h" -#define DEFER_TEXT_RENDERING 1 +#define DEFER_TEXT_RENDERING 0 -#define DEFER_PATHS 1 +#define DEFER_PATHS 0 -#define BATCH_RECT_TO_RECT (1 && !GR_STATIC_RECT_VB) +#define BATCH_RECT_TO_RECT (0 && !GR_STATIC_RECT_VB) #define MAX_BLUR_SIGMA 4.0f @@ -2056,7 +2056,6 @@ void GrContext::setupDrawBuffer() { GrAssert(NULL == fDrawBufferVBAllocPool); GrAssert(NULL == fDrawBufferIBAllocPool); -#if DEFER_TEXT_RENDERING || BATCH_RECT_TO_RECT fDrawBufferVBAllocPool = new GrVertexBufferAllocPool(fGpu, false, DRAW_BUFFER_VBPOOL_BUFFER_SIZE, @@ -2069,11 +2068,7 @@ void GrContext::setupDrawBuffer() { fDrawBuffer = new GrInOrderDrawBuffer(fGpu, fDrawBufferVBAllocPool, fDrawBufferIBAllocPool); -#endif - -#if BATCH_RECT_TO_RECT fDrawBuffer->setQuadIndexBuffer(this->getQuadIndexBuffer()); -#endif fDrawBuffer->setAutoFlushTarget(fGpu); fDrawBuffer->setDrawState(fDrawState); } diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp index 8214b6ea53..08ab47ab8c 100644 --- a/src/gpu/gl/GrGpuGL.cpp +++ b/src/gpu/gl/GrGpuGL.cpp @@ -1848,6 +1848,7 @@ void GrGpuGL::flushAAState(GrPrimitiveType type) { // we prefer smooth lines over multisampled lines // msaa should be disabled if drawing smooth lines. + bool handledMSAA = false; if (GrIsPrimTypeLines(type)) { bool smooth = this->willUseHWAALines(); if (!fHWAAState.fSmoothLineEnabled && smooth) { @@ -1857,14 +1858,15 @@ void GrGpuGL::flushAAState(GrPrimitiveType type) { GL_CALL(Disable(GR_GL_LINE_SMOOTH)); fHWAAState.fSmoothLineEnabled = false; } - if (rt->isMultisampled() && - fHWAAState.fMSAAEnabled) { + if (smooth && rt->isMultisampled() && fHWAAState.fMSAAEnabled) { GL_CALL(Disable(GR_GL_MULTISAMPLE)); fHWAAState.fMSAAEnabled = false; + handledMSAA = true; } - } else if (rt->isMultisampled() && - this->getDrawState().isHWAntialiasState() != - fHWAAState.fMSAAEnabled) { + } + if (!handledMSAA && rt->isMultisampled() && + this->getDrawState().isHWAntialiasState() != + fHWAAState.fMSAAEnabled) { if (fHWAAState.fMSAAEnabled) { GL_CALL(Disable(GR_GL_MULTISAMPLE)); fHWAAState.fMSAAEnabled = false; 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: |