|
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
|
4 * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 #include "WebGLContext.h" |
|
7 #include "WebGLExtensions.h" |
|
8 #include "mozilla/dom/WebGLRenderingContextBinding.h" |
|
9 #include "WebGLTexture.h" |
|
10 #include "WebGLRenderbuffer.h" |
|
11 #include "WebGLFramebuffer.h" |
|
12 #include "GLContext.h" |
|
13 |
|
14 #include <algorithm> |
|
15 |
|
16 using namespace mozilla; |
|
17 using namespace gl; |
|
18 |
|
19 WebGLExtensionDrawBuffers::WebGLExtensionDrawBuffers(WebGLContext* context) |
|
20 : WebGLExtensionBase(context) |
|
21 { |
|
22 GLint maxColorAttachments = 0; |
|
23 GLint maxDrawBuffers = 0; |
|
24 |
|
25 gl::GLContext* gl = context->GL(); |
|
26 |
|
27 context->MakeContextCurrent(); |
|
28 |
|
29 gl->fGetIntegerv(LOCAL_GL_MAX_COLOR_ATTACHMENTS, &maxColorAttachments); |
|
30 gl->fGetIntegerv(LOCAL_GL_MAX_DRAW_BUFFERS, &maxDrawBuffers); |
|
31 |
|
32 // WEBGL_draw_buffers specifications don't give a maximal value reachable by MAX_COLOR_ATTACHMENTS. |
|
33 maxColorAttachments = std::min(maxColorAttachments, GLint(WebGLContext::sMaxColorAttachments)); |
|
34 |
|
35 if (context->MinCapabilityMode()) |
|
36 { |
|
37 maxColorAttachments = std::min(maxColorAttachments, GLint(sMinColorAttachments)); |
|
38 } |
|
39 |
|
40 // WEBGL_draw_buffers specifications request MAX_COLOR_ATTACHMENTS >= MAX_DRAW_BUFFERS. |
|
41 maxDrawBuffers = std::min(maxDrawBuffers, GLint(maxColorAttachments)); |
|
42 |
|
43 context->mGLMaxColorAttachments = maxColorAttachments; |
|
44 context->mGLMaxDrawBuffers = maxDrawBuffers; |
|
45 } |
|
46 |
|
47 WebGLExtensionDrawBuffers::~WebGLExtensionDrawBuffers() |
|
48 { |
|
49 } |
|
50 |
|
51 void WebGLExtensionDrawBuffers::DrawBuffersWEBGL(const dom::Sequence<GLenum>& buffers) |
|
52 { |
|
53 if (mIsLost) |
|
54 return mContext->ErrorInvalidOperation("drawBuffersWEBGL: Extension is lost."); |
|
55 |
|
56 mContext->DrawBuffers(buffers); |
|
57 } |
|
58 |
|
59 bool WebGLExtensionDrawBuffers::IsSupported(const WebGLContext* context) |
|
60 { |
|
61 gl::GLContext * gl = context->GL(); |
|
62 |
|
63 if (!gl->IsSupported(GLFeature::draw_buffers)) { |
|
64 return false; |
|
65 } |
|
66 |
|
67 GLint supportedColorAttachments = 0; |
|
68 GLint supportedDrawBuffers = 0; |
|
69 |
|
70 context->MakeContextCurrent(); |
|
71 |
|
72 gl->fGetIntegerv(LOCAL_GL_MAX_COLOR_ATTACHMENTS, &supportedColorAttachments); |
|
73 gl->fGetIntegerv(LOCAL_GL_MAX_COLOR_ATTACHMENTS, &supportedDrawBuffers); |
|
74 |
|
75 if (size_t(supportedColorAttachments) < sMinColorAttachments){ |
|
76 // WEBGL_draw_buffers specifications request for 4 color attachments at least. |
|
77 return false; |
|
78 } |
|
79 |
|
80 if (size_t(supportedDrawBuffers) < sMinDrawBuffers){ |
|
81 return false; |
|
82 } |
|
83 |
|
84 return true; |
|
85 } |
|
86 |
|
87 IMPL_WEBGL_EXTENSION_GOOP(WebGLExtensionDrawBuffers) |