Extensions3DOpenGL.cpp [plain text]
#include "config.h"
#if ENABLE(WEBGL)
#include "Extensions3DOpenGL.h"
#include "GraphicsContext3D.h"
#include <wtf/Vector.h>
#if PLATFORM(MAC)
#include "ANGLE/ShaderLang.h"
#include <OpenGL/gl.h>
#elif PLATFORM(GTK) || PLATFORM(EFL) || PLATFORM(QT)
#include "OpenGLShims.h"
#endif
namespace WebCore {
Extensions3DOpenGL::Extensions3DOpenGL(GraphicsContext3D* context)
: m_initializedAvailableExtensions(false)
, m_context(context)
{
}
Extensions3DOpenGL::~Extensions3DOpenGL()
{
}
bool Extensions3DOpenGL::supports(const String& name)
{
if (!m_initializedAvailableExtensions) {
String extensionsString(reinterpret_cast<const char*>(::glGetString(GL_EXTENSIONS)));
Vector<String> availableExtensions;
extensionsString.split(" ", availableExtensions);
for (size_t i = 0; i < availableExtensions.size(); ++i)
m_availableExtensions.add(availableExtensions[i]);
m_initializedAvailableExtensions = true;
}
if (name == "GL_ANGLE_framebuffer_blit")
return m_availableExtensions.contains("GL_EXT_framebuffer_blit");
if (name == "GL_ANGLE_framebuffer_multisample")
return m_availableExtensions.contains("GL_EXT_framebuffer_multisample");
if (name == "GL_OES_rgb8_rgba8")
return true;
if (name == "GL_OES_texture_float" || name == "GL_OES_texture_half_float")
return m_availableExtensions.contains("GL_ARB_texture_float");
if (name == "GL_OES_vertex_array_object")
return m_availableExtensions.contains("GL_APPLE_vertex_array_object");
if (name == "GL_OES_standard_derivatives")
return true;
if (name == "GL_EXT_texture_filter_anisotropic")
return m_availableExtensions.contains("GL_EXT_texture_filter_anisotropic");
return m_availableExtensions.contains(name);
}
void Extensions3DOpenGL::ensureEnabled(const String& name)
{
#if PLATFORM(MAC) || PLATFORM(QT)
if (name == "GL_OES_standard_derivatives") {
ANGLEWebKitBridge& compiler = m_context->m_compiler;
ShBuiltInResources ANGLEResources = compiler.getResources();
if (!ANGLEResources.OES_standard_derivatives) {
ANGLEResources.OES_standard_derivatives = 1;
compiler.setResources(ANGLEResources);
}
}
#else
ASSERT_UNUSED(name, supports(name));
#endif
}
bool Extensions3DOpenGL::isEnabled(const String& name)
{
#if PLATFORM(MAC) || PLATFORM(QT)
if (name == "GL_OES_standard_derivatives") {
ANGLEWebKitBridge& compiler = m_context->m_compiler;
return compiler.getResources().OES_standard_derivatives;
}
#endif
return supports(name);
}
int Extensions3DOpenGL::getGraphicsResetStatusARB()
{
return GraphicsContext3D::NO_ERROR;
}
void Extensions3DOpenGL::blitFramebuffer(long srcX0, long srcY0, long srcX1, long srcY1, long dstX0, long dstY0, long dstX1, long dstY1, unsigned long mask, unsigned long filter)
{
::glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
}
void Extensions3DOpenGL::renderbufferStorageMultisample(unsigned long target, unsigned long samples, unsigned long internalformat, unsigned long width, unsigned long height)
{
::glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height);
}
Platform3DObject Extensions3DOpenGL::createVertexArrayOES()
{
m_context->makeContextCurrent();
#if !PLATFORM(GTK) && !PLATFORM(QT) && !PLATFORM(EFL) && defined(GL_APPLE_vertex_array_object) && GL_APPLE_vertex_array_object
GLuint array = 0;
glGenVertexArraysAPPLE(1, &array);
return array;
#else
return 0;
#endif
}
void Extensions3DOpenGL::deleteVertexArrayOES(Platform3DObject array)
{
if (!array)
return;
m_context->makeContextCurrent();
#if !PLATFORM(GTK) && !PLATFORM(QT) && !PLATFORM(EFL) && defined(GL_APPLE_vertex_array_object) && GL_APPLE_vertex_array_object
glDeleteVertexArraysAPPLE(1, &array);
#endif
}
GC3Dboolean Extensions3DOpenGL::isVertexArrayOES(Platform3DObject array)
{
if (!array)
return GL_FALSE;
m_context->makeContextCurrent();
#if !PLATFORM(GTK) && !PLATFORM(QT) && !PLATFORM(EFL) && defined(GL_APPLE_vertex_array_object) && GL_APPLE_vertex_array_object
return glIsVertexArrayAPPLE(array);
#else
return GL_FALSE;
#endif
}
void Extensions3DOpenGL::bindVertexArrayOES(Platform3DObject array)
{
if (!array)
return;
m_context->makeContextCurrent();
#if !PLATFORM(GTK) && !PLATFORM(QT) && !PLATFORM(EFL) && defined(GL_APPLE_vertex_array_object) && GL_APPLE_vertex_array_object
glBindVertexArrayAPPLE(array);
#endif
}
String Extensions3DOpenGL::getTranslatedShaderSourceANGLE(Platform3DObject shader)
{
UNUSED_PARAM(shader);
return "";
}
}
#endif // ENABLE(WEBGL)