Commit d3bd0ad3 by apatrick@chromium.org

Implemented GL_NV_fence extension.

I believe I have implemented all features according to the spec. The application is to allow the Chrome command buffer scheduler to be smarter about deciding which command buffer to process. For example, if a WebGL app issued a call to ReadPixels, the scheduler will issue a fence and defer executing the ReadPixels until the status goes true. It can continue to work on other command buffers in the meantime. I tested by modifying the vertex shader demo. After issuing the SwapBuffers i made issue a fence and loop until the status went true and verified it looped several times. I also tested that by calling FinishFence before going into the loop that is did not loop at all. Review URL: http://codereview.appspot.com/1965043 git-svn-id: https://angleproject.googlecode.com/svn/trunk@405 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 0a337e93
...@@ -177,6 +177,8 @@ ...@@ -177,6 +177,8 @@
'libGLESv2/Buffer.h', 'libGLESv2/Buffer.h',
'libGLESv2/Context.cpp', 'libGLESv2/Context.cpp',
'libGLESv2/Context.h', 'libGLESv2/Context.h',
'libGLESv2/Fence.cpp',
'libGLESv2/Fence.h',
'libGLESv2/Framebuffer.cpp', 'libGLESv2/Framebuffer.cpp',
'libGLESv2/Framebuffer.h', 'libGLESv2/Framebuffer.h',
'libGLESv2/libGLESv2.cpp', 'libGLESv2/libGLESv2.cpp',
......
...@@ -529,4 +529,16 @@ bool Display::getHalfFloatTextureSupport(bool *filtering) ...@@ -529,4 +529,16 @@ bool Display::getHalfFloatTextureSupport(bool *filtering)
D3DRTYPE_CUBETEXTURE, D3DFMT_A16B16G16R16F)); D3DRTYPE_CUBETEXTURE, D3DFMT_A16B16G16R16F));
} }
} }
bool Display::getEventQuerySupport()
{
IDirect3DQuery9 *query;
HRESULT result = mDevice->CreateQuery(D3DQUERYTYPE_EVENT, &query);
if (SUCCEEDED(result))
{
query->Release();
}
return result != D3DERR_NOTAVAILABLE;
}
} }
...@@ -64,6 +64,7 @@ class Display ...@@ -64,6 +64,7 @@ class Display
virtual bool getCompressedTextureSupport(); virtual bool getCompressedTextureSupport();
virtual bool getFloatTextureSupport(bool *filtering); virtual bool getFloatTextureSupport(bool *filtering);
virtual bool getHalfFloatTextureSupport(bool *filtering); virtual bool getHalfFloatTextureSupport(bool *filtering);
virtual bool getEventQuerySupport();
private: private:
DISALLOW_COPY_AND_ASSIGN(Display); DISALLOW_COPY_AND_ASSIGN(Display);
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include "libGLESv2/Blit.h" #include "libGLESv2/Blit.h"
#include "libGLESv2/ResourceManager.h" #include "libGLESv2/ResourceManager.h"
#include "libGLESv2/Buffer.h" #include "libGLESv2/Buffer.h"
#include "libGLESv2/Fence.h"
#include "libGLESv2/FrameBuffer.h" #include "libGLESv2/FrameBuffer.h"
#include "libGLESv2/Program.h" #include "libGLESv2/Program.h"
#include "libGLESv2/RenderBuffer.h" #include "libGLESv2/RenderBuffer.h"
...@@ -158,6 +159,8 @@ Context::Context(const egl::Config *config, const gl::Context *shareContext) ...@@ -158,6 +159,8 @@ Context::Context(const egl::Config *config, const gl::Context *shareContext)
mHasBeenCurrent = false; mHasBeenCurrent = false;
mSupportsCompressedTextures = false;
mSupportsEventQueries = false;
mMaxSupportedSamples = 0; mMaxSupportedSamples = 0;
mMaskedClearSavedState = NULL; mMaskedClearSavedState = NULL;
markAllStateDirty(); markAllStateDirty();
...@@ -180,6 +183,11 @@ Context::~Context() ...@@ -180,6 +183,11 @@ Context::~Context()
deleteFramebuffer(mFramebufferMap.begin()->first); deleteFramebuffer(mFramebufferMap.begin()->first);
} }
while (!mFenceMap.empty())
{
deleteFence(mFenceMap.begin()->first);
}
while (!mMultiSampleSupport.empty()) while (!mMultiSampleSupport.empty())
{ {
delete [] mMultiSampleSupport.begin()->second; delete [] mMultiSampleSupport.begin()->second;
...@@ -265,6 +273,7 @@ void Context::makeCurrent(egl::Display *display, egl::Surface *surface) ...@@ -265,6 +273,7 @@ void Context::makeCurrent(egl::Display *display, egl::Surface *surface)
mMaxSupportedSamples = max; mMaxSupportedSamples = max;
mSupportsEventQueries = display->getEventQuerySupport();
mSupportsCompressedTextures = display->getCompressedTextureSupport(); mSupportsCompressedTextures = display->getCompressedTextureSupport();
mSupportsFloatTextures = display->getFloatTextureSupport(&mSupportsFloatLinearFilter); mSupportsFloatTextures = display->getFloatTextureSupport(&mSupportsFloatLinearFilter);
mSupportsHalfFloatTextures = display->getHalfFloatTextureSupport(&mSupportsHalfFloatLinearFilter); mSupportsHalfFloatTextures = display->getHalfFloatTextureSupport(&mSupportsHalfFloatLinearFilter);
...@@ -812,6 +821,20 @@ GLuint Context::createFramebuffer() ...@@ -812,6 +821,20 @@ GLuint Context::createFramebuffer()
return handle; return handle;
} }
GLuint Context::createFence()
{
unsigned int handle = 0;
while (mFenceMap.find(handle) != mFenceMap.end())
{
handle++;
}
mFenceMap[handle] = new Fence;
return handle;
}
void Context::deleteBuffer(GLuint buffer) void Context::deleteBuffer(GLuint buffer)
{ {
if (mResourceManager->getBuffer(buffer)) if (mResourceManager->getBuffer(buffer))
...@@ -864,6 +887,17 @@ void Context::deleteFramebuffer(GLuint framebuffer) ...@@ -864,6 +887,17 @@ void Context::deleteFramebuffer(GLuint framebuffer)
mFramebufferMap.erase(framebufferObject); mFramebufferMap.erase(framebufferObject);
} }
} }
void Context::deleteFence(GLuint fence)
{
FenceMap::iterator fenceObject = mFenceMap.find(fence);
if (fenceObject != mFenceMap.end())
{
delete fenceObject->second;
mFenceMap.erase(fenceObject);
}
}
Buffer *Context::getBuffer(GLuint handle) Buffer *Context::getBuffer(GLuint handle)
{ {
...@@ -1007,6 +1041,20 @@ Framebuffer *Context::getFramebuffer(unsigned int handle) ...@@ -1007,6 +1041,20 @@ Framebuffer *Context::getFramebuffer(unsigned int handle)
} }
} }
Fence *Context::getFence(unsigned int handle)
{
FenceMap::iterator fence = mFenceMap.find(handle);
if (fence == mFenceMap.end())
{
return NULL;
}
else
{
return fence->second;
}
}
Buffer *Context::getArrayBuffer() Buffer *Context::getArrayBuffer()
{ {
return mState.arrayBuffer.get(); return mState.arrayBuffer.get();
...@@ -2790,6 +2838,11 @@ int Context::getNearestSupportedSamples(D3DFORMAT format, int requested) const ...@@ -2790,6 +2838,11 @@ int Context::getNearestSupportedSamples(D3DFORMAT format, int requested) const
return -1; return -1;
} }
bool Context::supportsEventQueries() const
{
return mSupportsEventQueries;
}
bool Context::supportsCompressedTextures() const bool Context::supportsCompressedTextures() const
{ {
return mSupportsCompressedTextures; return mSupportsCompressedTextures;
...@@ -3011,6 +3064,11 @@ void Context::initExtensionString() ...@@ -3011,6 +3064,11 @@ void Context::initExtensionString()
mExtensionString += "GL_ANGLE_framebuffer_blit "; mExtensionString += "GL_ANGLE_framebuffer_blit ";
mExtensionString += "GL_OES_rgb8_rgba8 "; mExtensionString += "GL_OES_rgb8_rgba8 ";
if (supportsEventQueries())
{
mExtensionString += "GL_NV_fence ";
}
if (supportsCompressedTextures()) if (supportsCompressedTextures())
{ {
mExtensionString += "GL_EXT_texture_compression_dxt1 "; mExtensionString += "GL_EXT_texture_compression_dxt1 ";
......
...@@ -51,6 +51,7 @@ class VertexDataManager; ...@@ -51,6 +51,7 @@ class VertexDataManager;
class IndexDataManager; class IndexDataManager;
class BufferBackEnd; class BufferBackEnd;
class Blit; class Blit;
class Fence;
enum enum
{ {
...@@ -312,6 +313,10 @@ class Context ...@@ -312,6 +313,10 @@ class Context
GLuint createFramebuffer(); GLuint createFramebuffer();
void deleteFramebuffer(GLuint framebuffer); void deleteFramebuffer(GLuint framebuffer);
// Fences are owned by the Context.
GLuint createFence();
void deleteFence(GLuint fence);
void bindArrayBuffer(GLuint buffer); void bindArrayBuffer(GLuint buffer);
void bindElementArrayBuffer(GLuint buffer); void bindElementArrayBuffer(GLuint buffer);
void bindTexture2D(GLuint texture); void bindTexture2D(GLuint texture);
...@@ -328,6 +333,7 @@ class Context ...@@ -328,6 +333,7 @@ class Context
void setVertexAttrib(GLuint index, const GLfloat *values); void setVertexAttrib(GLuint index, const GLfloat *values);
Buffer *getBuffer(GLuint handle); Buffer *getBuffer(GLuint handle);
Fence *getFence(GLuint handle);
Shader *getShader(GLuint handle); Shader *getShader(GLuint handle);
Program *getProgram(GLuint handle); Program *getProgram(GLuint handle);
Texture *getTexture(GLuint handle); Texture *getTexture(GLuint handle);
...@@ -377,6 +383,7 @@ class Context ...@@ -377,6 +383,7 @@ class Context
GLsizei getMaxSupportedSamples() const; GLsizei getMaxSupportedSamples() const;
int getNearestSupportedSamples(D3DFORMAT format, int requested) const; int getNearestSupportedSamples(D3DFORMAT format, int requested) const;
const char *getExtensionString() const; const char *getExtensionString() const;
bool supportsEventQueries() const;
bool supportsCompressedTextures() const; bool supportsCompressedTextures() const;
bool supportsFloatTextures() const; bool supportsFloatTextures() const;
bool supportsFloatLinearFilter() const; bool supportsFloatLinearFilter() const;
...@@ -419,6 +426,9 @@ class Context ...@@ -419,6 +426,9 @@ class Context
typedef std::map<GLuint, Framebuffer*> FramebufferMap; typedef std::map<GLuint, Framebuffer*> FramebufferMap;
FramebufferMap mFramebufferMap; FramebufferMap mFramebufferMap;
typedef std::map<GLuint, Fence*> FenceMap;
FenceMap mFenceMap;
void initExtensionString(); void initExtensionString();
std::string mExtensionString; std::string mExtensionString;
...@@ -447,6 +457,7 @@ class Context ...@@ -447,6 +457,7 @@ class Context
bool mSupportsShaderModel3; bool mSupportsShaderModel3;
std::map<D3DFORMAT, bool *> mMultiSampleSupport; std::map<D3DFORMAT, bool *> mMultiSampleSupport;
GLsizei mMaxSupportedSamples; GLsizei mMaxSupportedSamples;
bool mSupportsEventQueries;
bool mSupportsCompressedTextures; bool mSupportsCompressedTextures;
bool mSupportsFloatTextures; bool mSupportsFloatTextures;
bool mSupportsFloatLinearFilter; bool mSupportsFloatLinearFilter;
......
//
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Fence.cpp: Implements the gl::Fence class, which supports the GL_NV_fence extension.
#include "libGLESv2/Fence.h"
#include "libGLESv2/main.h"
namespace gl
{
Fence::Fence()
{
mQuery = NULL;
mCondition = GL_NONE;
mStatus = GL_FALSE;
}
Fence::~Fence()
{
if (mQuery != NULL)
{
mQuery->Release();
mQuery = NULL;
}
}
GLboolean Fence::isFence()
{
// GL_NV_fence spec:
// A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an existing fence.
return mQuery != NULL;
}
void Fence::setFence(GLenum condition)
{
if (mQuery != NULL)
{
mQuery->Release();
mQuery = NULL;
}
if (FAILED(getDevice()->CreateQuery(D3DQUERYTYPE_EVENT, &mQuery)))
{
return error(GL_OUT_OF_MEMORY);
}
HRESULT result = mQuery->Issue(D3DISSUE_END);
ASSERT(SUCCEEDED(result));
mCondition = condition;
mStatus = GL_FALSE;
}
GLboolean Fence::testFence()
{
if (mQuery == NULL)
{
return error(GL_INVALID_OPERATION, GL_TRUE);
}
HRESULT result = mQuery->GetData(NULL, 0, D3DGETDATA_FLUSH);
if (result == D3DERR_DEVICELOST)
{
return error(GL_OUT_OF_MEMORY, GL_TRUE);
}
ASSERT(result == S_OK || result == S_FALSE);
mStatus = result == S_OK;
return mStatus;
}
void Fence::finishFence()
{
if (mQuery == NULL)
{
return error(GL_INVALID_OPERATION);
}
while (!testFence())
{
Sleep(0);
}
}
void Fence::getFenceiv(GLenum pname, GLint *params)
{
if (mQuery == NULL)
{
return error(GL_INVALID_OPERATION);
}
switch (pname)
{
case GL_FENCE_STATUS_NV:
{
// GL_NV_fence spec:
// Once the status of a fence has been finished (via FinishFenceNV) or tested and the returned status is TRUE (via either TestFenceNV
// or GetFenceivNV querying the FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
if (mStatus)
{
params[0] = GL_TRUE;
return;
}
HRESULT result = mQuery->GetData(NULL, 0, 0);
if (result == D3DERR_DEVICELOST)
{
params[0] = GL_TRUE;
return error(GL_OUT_OF_MEMORY);
}
ASSERT(result == S_OK || result == S_FALSE);
mStatus = result == S_OK;
params[0] = mStatus;
break;
}
case GL_FENCE_CONDITION_NV:
params[0] = mCondition;
break;
default:
return error(GL_INVALID_ENUM);
break;
}
}
}
//
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Fence.h: Defines the gl::Fence class, which supports the GL_NV_fence extension.
#ifndef LIBGLESV2_FENCE_H_
#define LIBGLESV2_FENCE_H_
#define GL_APICALL
#include <GLES2/gl2.h>
#include <d3d9.h>
#include "common/angleutils.h"
namespace gl
{
class Fence
{
public:
Fence();
virtual ~Fence();
GLboolean isFence();
void setFence(GLenum condition);
GLboolean testFence();
void finishFence();
void getFenceiv(GLenum pname, GLint *params);
private:
DISALLOW_COPY_AND_ASSIGN(Fence);
IDirect3DQuery9* mQuery;
GLenum mCondition;
GLboolean mStatus;
};
}
#endif // LIBGLESV2_FENCE_H_
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "libGLESv2/utilities.h" #include "libGLESv2/utilities.h"
#include "libGLESv2/Buffer.h" #include "libGLESv2/Buffer.h"
#include "libGLESv2/Context.h" #include "libGLESv2/Context.h"
#include "libGLESv2/Fence.h"
#include "libGLESv2/Framebuffer.h" #include "libGLESv2/Framebuffer.h"
#include "libGLESv2/Program.h" #include "libGLESv2/Program.h"
#include "libGLESv2/Renderbuffer.h" #include "libGLESv2/Renderbuffer.h"
...@@ -1313,6 +1314,33 @@ void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers) ...@@ -1313,6 +1314,33 @@ void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
} }
} }
void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
{
TRACE("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
try
{
if (n < 0)
{
return error(GL_INVALID_VALUE);
}
gl::Context *context = gl::getContext();
if (context)
{
for (int i = 0; i < n; i++)
{
context->deleteFence(fences[i]);
}
}
}
catch(std::bad_alloc&)
{
return error(GL_OUT_OF_MEMORY);
}
}
void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers) void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
{ {
TRACE("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers); TRACE("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
...@@ -1768,6 +1796,32 @@ void __stdcall glEnableVertexAttribArray(GLuint index) ...@@ -1768,6 +1796,32 @@ void __stdcall glEnableVertexAttribArray(GLuint index)
} }
} }
void __stdcall glFinishFenceNV(GLuint fence)
{
TRACE("(GLuint fence = %d)", fence);
try
{
gl::Context *context = gl::getContext();
if (context)
{
gl::Fence* fenceObject = context->getFence(fence);
if (fenceObject == NULL)
{
return error(GL_INVALID_OPERATION);
}
fenceObject->finishFence();
}
}
catch(std::bad_alloc&)
{
return error(GL_OUT_OF_MEMORY);
}
}
void __stdcall glFinish(void) void __stdcall glFinish(void)
{ {
TRACE("()"); TRACE("()");
...@@ -2066,6 +2120,33 @@ void __stdcall glGenerateMipmap(GLenum target) ...@@ -2066,6 +2120,33 @@ void __stdcall glGenerateMipmap(GLenum target)
} }
} }
void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
{
TRACE("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
try
{
if (n < 0)
{
return error(GL_INVALID_VALUE);
}
gl::Context *context = gl::getContext();
if (context)
{
for (int i = 0; i < n; i++)
{
fences[i] = context->createFence();
}
}
}
catch(std::bad_alloc&)
{
return error(GL_OUT_OF_MEMORY);
}
}
void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers) void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
{ {
TRACE("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers); TRACE("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
...@@ -2441,6 +2522,33 @@ GLenum __stdcall glGetError(void) ...@@ -2441,6 +2522,33 @@ GLenum __stdcall glGetError(void)
return GL_NO_ERROR; return GL_NO_ERROR;
} }
void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
{
TRACE("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
try
{
gl::Context *context = gl::getContext();
if (context)
{
gl::Fence *fenceObject = context->getFence(fence);
if (fenceObject == NULL)
{
return error(GL_INVALID_OPERATION);
}
fenceObject->getFenceiv(pname, params);
}
}
catch(std::bad_alloc&)
{
return error(GL_OUT_OF_MEMORY);
}
}
void __stdcall glGetFloatv(GLenum pname, GLfloat* params) void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
{ {
TRACE("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params); TRACE("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
...@@ -3524,6 +3632,34 @@ GLboolean __stdcall glIsEnabled(GLenum cap) ...@@ -3524,6 +3632,34 @@ GLboolean __stdcall glIsEnabled(GLenum cap)
return false; return false;
} }
GLboolean __stdcall glIsFenceNV(GLuint fence)
{
TRACE("(GLuint fence = %d)", fence);
try
{
gl::Context *context = gl::getContext();
if (context)
{
gl::Fence *fenceObject = context->getFence(fence);
if (fenceObject == NULL)
{
return GL_FALSE;
}
return fenceObject->isFence();
}
}
catch(std::bad_alloc&)
{
return error(GL_OUT_OF_MEMORY, GL_FALSE);
}
return GL_FALSE;
}
GLboolean __stdcall glIsFramebuffer(GLuint framebuffer) GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
{ {
TRACE("(GLuint framebuffer = %d)", framebuffer); TRACE("(GLuint framebuffer = %d)", framebuffer);
...@@ -3949,6 +4085,37 @@ void __stdcall glSampleCoverage(GLclampf value, GLboolean invert) ...@@ -3949,6 +4085,37 @@ void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
} }
} }
void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
{
TRACE("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
try
{
if (condition != GL_ALL_COMPLETED_NV)
{
return error(GL_INVALID_ENUM);
}
gl::Context *context = gl::getContext();
if (context)
{
gl::Fence *fenceObject = context->getFence(fence);
if (fenceObject == NULL)
{
return error(GL_INVALID_OPERATION);
}
fenceObject->setFence(condition);
}
}
catch(std::bad_alloc&)
{
return error(GL_OUT_OF_MEMORY);
}
}
void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height) void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
{ {
TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height); TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
...@@ -4216,6 +4383,34 @@ void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenu ...@@ -4216,6 +4383,34 @@ void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenu
} }
} }
GLboolean __stdcall glTestFenceNV(GLuint fence)
{
TRACE("(GLuint fence = %d)", fence);
try
{
gl::Context *context = gl::getContext();
if (context)
{
gl::Fence *fenceObject = context->getFence(fence);
if (fenceObject == NULL)
{
return error(GL_INVALID_OPERATION, GL_TRUE);
}
return fenceObject->testFence();
}
}
catch(std::bad_alloc&)
{
error(GL_OUT_OF_MEMORY);
}
return GL_TRUE;
}
void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
GLint border, GLenum format, GLenum type, const GLvoid* pixels) GLint border, GLenum format, GLenum type, const GLvoid* pixels)
{ {
...@@ -5501,6 +5696,13 @@ __eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char * ...@@ -5501,6 +5696,13 @@ __eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *
{ {
{"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES}, {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
{"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE}, {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
{"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
{"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
{"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
{"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
{"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
{"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
{"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
}; };
for (int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++) for (int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++)
......
...@@ -147,7 +147,14 @@ EXPORTS ...@@ -147,7 +147,14 @@ EXPORTS
glTexImage3DOES @143 glTexImage3DOES @143
glBlitFramebufferANGLE @149 glBlitFramebufferANGLE @149
glRenderbufferStorageMultisampleANGLE @150 glRenderbufferStorageMultisampleANGLE @150
glDeleteFencesNV @151
glFinishFenceNV @152
glGenFencesNV @153
glGetFenceivNV @154
glIsFenceNV @155
glSetFenceNV @156
glTestFenceNV @157
; EGL dependencies ; EGL dependencies
glCreateContext @144 NONAME glCreateContext @144 NONAME
glDestroyContext @145 NONAME glDestroyContext @145 NONAME
......
...@@ -201,6 +201,10 @@ ...@@ -201,6 +201,10 @@
> >
</File> </File>
<File <File
RelativePath=".\Fence.cpp"
>
</File>
<File
RelativePath=".\Framebuffer.cpp" RelativePath=".\Framebuffer.cpp"
> >
</File> </File>
...@@ -279,6 +283,10 @@ ...@@ -279,6 +283,10 @@
> >
</File> </File>
<File <File
RelativePath=".\Fence.h"
>
</File>
<File
RelativePath=".\Framebuffer.h" RelativePath=".\Framebuffer.h"
> >
</File> </File>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment