Add entry points and constants for GL_ANGLE_instanced_arrays.

TRAC #19489 Signed-off-by: Daniel Koch Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@968 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 21a849dc
...@@ -233,6 +233,11 @@ typedef void* GLeglImageOES; ...@@ -233,6 +233,11 @@ typedef void* GLeglImageOES;
#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 #define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3
#endif #endif
/* GL_ANGLE_instanced_arrays */
#ifndef GL_ANGLE_instanced_arrays
#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE
#endif
/*------------------------------------------------------------------------* /*------------------------------------------------------------------------*
* APPLE extension tokens * APPLE extension tokens
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
...@@ -951,6 +956,19 @@ typedef void (GL_APIENTRYP PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shad ...@@ -951,6 +956,19 @@ typedef void (GL_APIENTRYP PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shad
#define GL_ANGLE_texture_usage 1 #define GL_ANGLE_texture_usage 1
#endif #endif
/* GL_ANGLE_instanced_arrays */
#ifndef GL_ANGLE_instanced_arrays
#define GL_ANGLE_instanced_arrays 1
#ifdef GL_GLEXT_PROTOTYPES
GL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLE(GLuint index, GLuint divisor);
GL_APICALL void GL_APIENTRY glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount);
GL_APICALL void GL_APIENTRY glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount);
#endif
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor);
typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount);
#endif
/*------------------------------------------------------------------------* /*------------------------------------------------------------------------*
* APPLE extension functions * APPLE extension functions
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
......
...@@ -2264,7 +2264,7 @@ GLenum Context::applyVertexBuffer(GLint first, GLsizei count) ...@@ -2264,7 +2264,7 @@ GLenum Context::applyVertexBuffer(GLint first, GLsizei count)
} }
// Applies the indices and element array bindings to the Direct3D 9 device // Applies the indices and element array bindings to the Direct3D 9 device
GLenum Context::applyIndexBuffer(const void *indices, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo) GLenum Context::applyIndexBuffer(const GLvoid *indices, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo)
{ {
GLenum err = mIndexDataManager->prepareIndexData(type, count, mState.elementArrayBuffer.get(), indices, indexInfo); GLenum err = mIndexDataManager->prepareIndexData(type, count, mState.elementArrayBuffer.get(), indices, indexInfo);
...@@ -2963,7 +2963,7 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count) ...@@ -2963,7 +2963,7 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count)
} }
} }
void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices) void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
{ {
if (!mState.currentProgram) if (!mState.currentProgram)
{ {
...@@ -3028,6 +3028,20 @@ void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void * ...@@ -3028,6 +3028,20 @@ void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void *
} }
} }
void Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
{
UNIMPLEMENTED(); // TODO
drawArrays(mode, first, count);
}
void Context::drawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
{
UNIMPLEMENTED(); // TODO
drawElements(mode, count, type, indices);
}
// Implements glFlush when block is false, glFinish when block is true // Implements glFlush when block is false, glFinish when block is true
void Context::sync(bool block) void Context::sync(bool block)
{ {
...@@ -3096,7 +3110,7 @@ void Context::drawClosingLine(unsigned int first, unsigned int last, int minInde ...@@ -3096,7 +3110,7 @@ void Context::drawClosingLine(unsigned int first, unsigned int last, int minInde
} }
} }
void Context::drawClosingLine(GLsizei count, GLenum type, const void *indices, int minIndex) void Context::drawClosingLine(GLsizei count, GLenum type, const GLvoid *indices, int minIndex)
{ {
unsigned int first = 0; unsigned int first = 0;
unsigned int last = 0; unsigned int last = 0;
...@@ -3562,6 +3576,13 @@ void Context::setVertexAttrib(GLuint index, const GLfloat *values) ...@@ -3562,6 +3576,13 @@ void Context::setVertexAttrib(GLuint index, const GLfloat *values)
mVertexDataManager->dirtyCurrentValue(index); mVertexDataManager->dirtyCurrentValue(index);
} }
void Context::setVertexAttribDivisor(GLuint index, GLuint divisor)
{
ASSERT(index < gl::MAX_VERTEX_ATTRIBS);
mState.vertexAttribute[index].mDivisor = divisor;
}
// keep list sorted in following order // keep list sorted in following order
// OES extensions // OES extensions
// EXT extensions // EXT extensions
......
...@@ -104,7 +104,7 @@ struct Color ...@@ -104,7 +104,7 @@ struct Color
class VertexAttribute class VertexAttribute
{ {
public: public:
VertexAttribute() : mType(GL_FLOAT), mSize(0), mNormalized(false), mStride(0), mPointer(NULL), mArrayEnabled(false) VertexAttribute() : mType(GL_FLOAT), mSize(0), mNormalized(false), mStride(0), mPointer(NULL), mArrayEnabled(false), mDivisor(0)
{ {
mCurrentValue[0] = 0.0f; mCurrentValue[0] = 0.0f;
mCurrentValue[1] = 0.0f; mCurrentValue[1] = 0.0f;
...@@ -147,6 +147,7 @@ class VertexAttribute ...@@ -147,6 +147,7 @@ class VertexAttribute
bool mArrayEnabled; // From glEnable/DisableVertexAttribArray bool mArrayEnabled; // From glEnable/DisableVertexAttribArray
float mCurrentValue[4]; // From glVertexAttrib float mCurrentValue[4]; // From glVertexAttrib
unsigned int mDivisor;
}; };
typedef VertexAttribute VertexAttributeArray[MAX_VERTEX_ATTRIBS]; typedef VertexAttribute VertexAttributeArray[MAX_VERTEX_ATTRIBS];
...@@ -423,6 +424,7 @@ class Context ...@@ -423,6 +424,7 @@ class Context
void setRenderbufferStorage(RenderbufferStorage *renderbuffer); void setRenderbufferStorage(RenderbufferStorage *renderbuffer);
void setVertexAttrib(GLuint index, const GLfloat *values); void setVertexAttrib(GLuint index, const GLfloat *values);
void setVertexAttribDivisor(GLuint index, GLuint divisor);
Buffer *getBuffer(GLuint handle); Buffer *getBuffer(GLuint handle);
Fence *getFence(GLuint handle); Fence *getFence(GLuint handle);
...@@ -451,12 +453,14 @@ class Context ...@@ -451,12 +453,14 @@ class Context
void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei *bufSize, void* pixels); void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei *bufSize, void* pixels);
void clear(GLbitfield mask); void clear(GLbitfield mask);
void drawArrays(GLenum mode, GLint first, GLsizei count); void drawArrays(GLenum mode, GLint first, GLsizei count);
void drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices); void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
void drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei primcount);
void drawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount);
void sync(bool block); // flush/finish void sync(bool block); // flush/finish
// Draw the last segment of a line loop // Draw the last segment of a line loop
void drawClosingLine(unsigned int first, unsigned int last, int minIndex); void drawClosingLine(unsigned int first, unsigned int last, int minIndex);
void drawClosingLine(GLsizei count, GLenum type, const void *indices, int minIndex); void drawClosingLine(GLsizei count, GLenum type, const GLvoid *indices, int minIndex);
void recordInvalidEnum(); void recordInvalidEnum();
void recordInvalidValue(); void recordInvalidValue();
...@@ -511,7 +515,7 @@ class Context ...@@ -511,7 +515,7 @@ class Context
bool applyRenderTarget(bool ignoreViewport); bool applyRenderTarget(bool ignoreViewport);
void applyState(GLenum drawMode); void applyState(GLenum drawMode);
GLenum applyVertexBuffer(GLint first, GLsizei count); GLenum applyVertexBuffer(GLint first, GLsizei count);
GLenum applyIndexBuffer(const void *indices, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo); GLenum applyIndexBuffer(const GLvoid *indices, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo);
void applyShaders(); void applyShaders();
void applyTextures(); void applyTextures();
void applyTextures(SamplerType type); void applyTextures(SamplerType type);
......
...@@ -92,7 +92,7 @@ void computeRange(const IndexType *indices, GLsizei count, GLuint *minIndex, GLu ...@@ -92,7 +92,7 @@ void computeRange(const IndexType *indices, GLsizei count, GLuint *minIndex, GLu
} }
} }
void computeRange(GLenum type, const void *indices, GLsizei count, GLuint *minIndex, GLuint *maxIndex) void computeRange(GLenum type, const GLvoid *indices, GLsizei count, GLuint *minIndex, GLuint *maxIndex)
{ {
if (type == GL_UNSIGNED_BYTE) if (type == GL_UNSIGNED_BYTE)
{ {
...@@ -109,7 +109,7 @@ void computeRange(GLenum type, const void *indices, GLsizei count, GLuint *minIn ...@@ -109,7 +109,7 @@ void computeRange(GLenum type, const void *indices, GLsizei count, GLuint *minIn
else UNREACHABLE(); else UNREACHABLE();
} }
GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, Buffer *buffer, const void *indices, TranslatedIndexData *translated) GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, Buffer *buffer, const GLvoid *indices, TranslatedIndexData *translated)
{ {
if (!mStreamingBufferShort) if (!mStreamingBufferShort)
{ {
......
...@@ -123,7 +123,7 @@ class IndexDataManager ...@@ -123,7 +123,7 @@ class IndexDataManager
IndexDataManager(Context *context, IDirect3DDevice9 *evice); IndexDataManager(Context *context, IDirect3DDevice9 *evice);
virtual ~IndexDataManager(); virtual ~IndexDataManager();
GLenum prepareIndexData(GLenum type, GLsizei count, Buffer *arrayElementBuffer, const void *indices, TranslatedIndexData *translated); GLenum prepareIndexData(GLenum type, GLsizei count, Buffer *arrayElementBuffer, const GLvoid *indices, TranslatedIndexData *translated);
private: private:
DISALLOW_COPY_AND_ASSIGN(IndexDataManager); DISALLOW_COPY_AND_ASSIGN(IndexDataManager);
......
...@@ -1952,6 +1952,30 @@ void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count) ...@@ -1952,6 +1952,30 @@ void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
} }
} }
void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
{
EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
try
{
if (count < 0 || first < 0 || primcount < 0)
{
return error(GL_INVALID_VALUE);
}
gl::Context *context = gl::getNonLostContext();
if (context)
{
context->drawArraysInstanced(mode, first, count, primcount);
}
}
catch(std::bad_alloc&)
{
return error(GL_OUT_OF_MEMORY);
}
}
void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices) void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
{ {
EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p)", EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p)",
...@@ -1992,6 +2016,46 @@ void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLv ...@@ -1992,6 +2016,46 @@ void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLv
} }
} }
void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
{
EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
mode, count, type, indices, primcount);
try
{
if (count < 0 || primcount < 0)
{
return error(GL_INVALID_VALUE);
}
gl::Context *context = gl::getNonLostContext();
if (context)
{
switch (type)
{
case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT:
break;
case GL_UNSIGNED_INT:
if (!context->supports32bitIndices())
{
return error(GL_INVALID_ENUM);
}
break;
default:
return error(GL_INVALID_ENUM);
}
context->drawElementsInstanced(mode, count, type, indices, primcount);
}
}
catch(std::bad_alloc&)
{
return error(GL_OUT_OF_MEMORY);
}
}
void __stdcall glEnable(GLenum cap) void __stdcall glEnable(GLenum cap)
{ {
EVENT("(GLenum cap = 0x%X)", cap); EVENT("(GLenum cap = 0x%X)", cap);
...@@ -3920,6 +3984,9 @@ void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params) ...@@ -3920,6 +3984,9 @@ void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
params[i] = attribState.mCurrentValue[i]; params[i] = attribState.mCurrentValue[i];
} }
break; break;
case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
*params = (GLfloat)attribState.mDivisor;
break;
default: return error(GL_INVALID_ENUM); default: return error(GL_INVALID_ENUM);
} }
} }
...@@ -3974,6 +4041,9 @@ void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params) ...@@ -3974,6 +4041,9 @@ void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f)); params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
} }
break; break;
case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
*params = (GLint)attribState.mDivisor;
break;
default: return error(GL_INVALID_ENUM); default: return error(GL_INVALID_ENUM);
} }
} }
...@@ -6225,6 +6295,30 @@ void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values) ...@@ -6225,6 +6295,30 @@ void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
} }
} }
void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
{
EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
try
{
if (index >= gl::MAX_VERTEX_ATTRIBS)
{
return error(GL_INVALID_VALUE);
}
gl::Context *context = gl::getNonLostContext();
if (context)
{
context->setVertexAttribDivisor(index, divisor);
}
}
catch(std::bad_alloc&)
{
return error(GL_OUT_OF_MEMORY);
}
}
void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr) void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
{ {
EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, " EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
......
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