Commit 895aa621 by Nicolas Capens

Eliminate intermediate primitive type translation.

Bug 21305111 Change-Id: I3803f274f25a25ec60f0f5cbfc4af0151f39ad04 Reviewed-on: https://swiftshader-review.googlesource.com/4505Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent ae05d655
...@@ -2685,10 +2685,10 @@ void Context::clear(GLbitfield mask) ...@@ -2685,10 +2685,10 @@ void Context::clear(GLbitfield mask)
void Context::drawArrays(GLenum mode, GLint first, GLsizei count) void Context::drawArrays(GLenum mode, GLint first, GLsizei count)
{ {
PrimitiveType primitiveType; sw::DrawType primitiveType;
int primitiveCount; int primitiveCount;
if(!es2sw::ConvertPrimitiveType(mode, count, primitiveType, primitiveCount)) if(!es2sw::ConvertPrimitiveType(mode, count, GL_NONE, primitiveType, primitiveCount))
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
if(primitiveCount <= 0) if(primitiveCount <= 0)
...@@ -2724,10 +2724,10 @@ void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void * ...@@ -2724,10 +2724,10 @@ void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void *
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
PrimitiveType primitiveType; sw::DrawType primitiveType;
int primitiveCount; int primitiveCount;
if(!es2sw::ConvertPrimitiveType(mode, count, primitiveType, primitiveCount)) if(!es2sw::ConvertPrimitiveType(mode, count, type, primitiveType, primitiveCount))
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
if(primitiveCount <= 0) if(primitiveCount <= 0)
...@@ -2760,7 +2760,7 @@ void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void * ...@@ -2760,7 +2760,7 @@ void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void *
if(!cullSkipsDraw(mode)) if(!cullSkipsDraw(mode))
{ {
device->drawIndexedPrimitive(primitiveType, indexInfo.indexOffset, primitiveCount, IndexDataManager::typeSize(type)); device->drawIndexedPrimitive(primitiveType, indexInfo.indexOffset, primitiveCount);
} }
} }
......
...@@ -31,8 +31,8 @@ namespace es1 ...@@ -31,8 +31,8 @@ namespace es1
Device::Device(Context *context) : Renderer(context, OpenGL, true), context(context) Device::Device(Context *context) : Renderer(context, OpenGL, true), context(context)
{ {
depthStencil = 0; depthStencil = nullptr;
renderTarget = 0; renderTarget = nullptr;
setDepthBufferEnable(true); setDepthBufferEnable(true);
setFillMode(FILL_SOLID); setFillMode(FILL_SOLID);
...@@ -124,13 +124,13 @@ namespace es1 ...@@ -124,13 +124,13 @@ namespace es1
if(depthStencil) if(depthStencil)
{ {
depthStencil->release(); depthStencil->release();
depthStencil = 0; depthStencil = nullptr;
} }
if(renderTarget) if(renderTarget)
{ {
renderTarget->release(); renderTarget->release();
renderTarget = 0; renderTarget = nullptr;
} }
delete context; delete context;
...@@ -281,86 +281,26 @@ namespace es1 ...@@ -281,86 +281,26 @@ namespace es1
return surface; return surface;
} }
void Device::drawIndexedPrimitive(PrimitiveType type, unsigned int indexOffset, unsigned int primitiveCount, int indexSize) void Device::drawIndexedPrimitive(sw::DrawType type, unsigned int indexOffset, unsigned int primitiveCount)
{ {
if(!bindResources() || !primitiveCount) if(!bindResources() || !primitiveCount)
{ {
return; return;
} }
DrawType drawType; draw(type, indexOffset, primitiveCount);
if(indexSize == 4)
{
switch(type)
{
case DRAW_POINTLIST: drawType = sw::DRAW_INDEXEDPOINTLIST32; break;
case DRAW_LINELIST: drawType = sw::DRAW_INDEXEDLINELIST32; break;
case DRAW_LINESTRIP: drawType = sw::DRAW_INDEXEDLINESTRIP32; break;
case DRAW_LINELOOP: drawType = sw::DRAW_INDEXEDLINELOOP32; break;
case DRAW_TRIANGLELIST: drawType = sw::DRAW_INDEXEDTRIANGLELIST32; break;
case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_INDEXEDTRIANGLESTRIP32; break;
case DRAW_TRIANGLEFAN: drawType = sw::DRAW_INDEXEDTRIANGLEFAN32; break;
default: UNREACHABLE(type);
}
}
else if(indexSize == 2)
{
switch(type)
{
case DRAW_POINTLIST: drawType = sw::DRAW_INDEXEDPOINTLIST16; break;
case DRAW_LINELIST: drawType = sw::DRAW_INDEXEDLINELIST16; break;
case DRAW_LINESTRIP: drawType = sw::DRAW_INDEXEDLINESTRIP16; break;
case DRAW_LINELOOP: drawType = sw::DRAW_INDEXEDLINELOOP16; break;
case DRAW_TRIANGLELIST: drawType = sw::DRAW_INDEXEDTRIANGLELIST16; break;
case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_INDEXEDTRIANGLESTRIP16; break;
case DRAW_TRIANGLEFAN: drawType = sw::DRAW_INDEXEDTRIANGLEFAN16; break;
default: UNREACHABLE(type);
}
}
else if(indexSize == 1)
{
switch(type)
{
case DRAW_POINTLIST: drawType = sw::DRAW_INDEXEDPOINTLIST8; break;
case DRAW_LINELIST: drawType = sw::DRAW_INDEXEDLINELIST8; break;
case DRAW_LINESTRIP: drawType = sw::DRAW_INDEXEDLINESTRIP8; break;
case DRAW_LINELOOP: drawType = sw::DRAW_INDEXEDLINELOOP8; break;
case DRAW_TRIANGLELIST: drawType = sw::DRAW_INDEXEDTRIANGLELIST8; break;
case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_INDEXEDTRIANGLESTRIP8; break;
case DRAW_TRIANGLEFAN: drawType = sw::DRAW_INDEXEDTRIANGLEFAN8; break;
default: UNREACHABLE(type);
}
}
else UNREACHABLE(indexSize);
draw(drawType, indexOffset, primitiveCount);
} }
void Device::drawPrimitive(PrimitiveType primitiveType, unsigned int primitiveCount) void Device::drawPrimitive(sw::DrawType type, unsigned int primitiveCount)
{ {
if(!bindResources() || !primitiveCount) if(!bindResources() || !primitiveCount)
{ {
return; return;
} }
setIndexBuffer(0); setIndexBuffer(nullptr);
DrawType drawType;
switch(primitiveType)
{
case DRAW_POINTLIST: drawType = sw::DRAW_POINTLIST; break;
case DRAW_LINELIST: drawType = sw::DRAW_LINELIST; break;
case DRAW_LINESTRIP: drawType = sw::DRAW_LINESTRIP; break;
case DRAW_LINELOOP: drawType = sw::DRAW_LINELOOP; break;
case DRAW_TRIANGLELIST: drawType = sw::DRAW_TRIANGLELIST; break;
case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_TRIANGLESTRIP; break;
case DRAW_TRIANGLEFAN: drawType = sw::DRAW_TRIANGLEFAN; break;
default: UNREACHABLE(primitiveType);
}
draw(drawType, 0, primitiveCount); draw(type, 0, primitiveCount);
} }
void Device::setDepthStencilSurface(egl::Image *depthStencil) void Device::setDepthStencilSurface(egl::Image *depthStencil)
......
...@@ -23,17 +23,6 @@ namespace es1 ...@@ -23,17 +23,6 @@ namespace es1
{ {
class Texture; class Texture;
enum PrimitiveType
{
DRAW_POINTLIST,
DRAW_LINELIST,
DRAW_LINESTRIP,
DRAW_LINELOOP,
DRAW_TRIANGLELIST,
DRAW_TRIANGLESTRIP,
DRAW_TRIANGLEFAN
};
struct Viewport struct Viewport
{ {
int x0; int x0;
...@@ -56,8 +45,8 @@ namespace es1 ...@@ -56,8 +45,8 @@ namespace es1
virtual void clearStencil(unsigned int stencil, unsigned int mask); virtual void clearStencil(unsigned int stencil, unsigned int mask);
virtual egl::Image *createDepthStencilSurface(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard); virtual egl::Image *createDepthStencilSurface(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
virtual egl::Image *createRenderTarget(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool lockable); virtual egl::Image *createRenderTarget(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool lockable);
virtual void drawIndexedPrimitive(PrimitiveType type, unsigned int indexOffset, unsigned int primitiveCount, int indexSize); virtual void drawIndexedPrimitive(sw::DrawType type, unsigned int indexOffset, unsigned int primitiveCount);
virtual void drawPrimitive(PrimitiveType primitiveType, unsigned int primiveCount); virtual void drawPrimitive(sw::DrawType type, unsigned int primiveCount);
virtual void setDepthStencilSurface(egl::Image *newDepthStencil); virtual void setDepthStencilSurface(egl::Image *newDepthStencil);
virtual void setScissorEnable(bool enable); virtual void setScissorEnable(bool enable);
virtual void setRenderTarget(int index, egl::Image *renderTarget); virtual void setRenderTarget(int index, egl::Image *renderTarget);
......
...@@ -434,42 +434,54 @@ namespace es2sw ...@@ -434,42 +434,54 @@ namespace es2sw
} }
} }
bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount, es1::PrimitiveType &swPrimitiveType, int &primitiveCount) bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount, GLenum elementType, sw::DrawType &drawType, int &primitiveCount)
{ {
switch(primitiveType) switch(primitiveType)
{ {
case GL_POINTS: case GL_POINTS:
swPrimitiveType = es1::DRAW_POINTLIST; drawType = sw::DRAW_POINTLIST;
primitiveCount = elementCount; primitiveCount = elementCount;
break; break;
case GL_LINES: case GL_LINES:
swPrimitiveType = es1::DRAW_LINELIST; drawType = sw::DRAW_LINELIST;
primitiveCount = elementCount / 2; primitiveCount = elementCount / 2;
break; break;
case GL_LINE_LOOP: case GL_LINE_LOOP:
swPrimitiveType = es1::DRAW_LINELOOP; drawType = sw::DRAW_LINELOOP;
primitiveCount = elementCount; primitiveCount = elementCount;
break; break;
case GL_LINE_STRIP: case GL_LINE_STRIP:
swPrimitiveType = es1::DRAW_LINESTRIP; drawType = sw::DRAW_LINESTRIP;
primitiveCount = elementCount - 1; primitiveCount = elementCount - 1;
break; break;
case GL_TRIANGLES: case GL_TRIANGLES:
swPrimitiveType = es1::DRAW_TRIANGLELIST; drawType = sw::DRAW_TRIANGLELIST;
primitiveCount = elementCount / 3; primitiveCount = elementCount / 3;
break; break;
case GL_TRIANGLE_STRIP: case GL_TRIANGLE_STRIP:
swPrimitiveType = es1::DRAW_TRIANGLESTRIP; drawType = sw::DRAW_TRIANGLESTRIP;
primitiveCount = elementCount - 2; primitiveCount = elementCount - 2;
break; break;
case GL_TRIANGLE_FAN: case GL_TRIANGLE_FAN:
swPrimitiveType = es1::DRAW_TRIANGLEFAN; drawType = sw::DRAW_TRIANGLEFAN;
primitiveCount = elementCount - 2; primitiveCount = elementCount - 2;
break; break;
default: default:
return false; return false;
} }
sw::DrawType elementSize;
switch(elementType)
{
case GL_NONE: elementSize = sw::DRAW_NONINDEXED; break;
case GL_UNSIGNED_BYTE: elementSize = sw::DRAW_INDEXED8; break;
case GL_UNSIGNED_SHORT: elementSize = sw::DRAW_INDEXED16; break;
case GL_UNSIGNED_INT: elementSize = sw::DRAW_INDEXED32; break;
default: return false;
}
drawType = sw::DrawType(drawType | elementSize);
return true; return true;
} }
......
...@@ -59,7 +59,7 @@ namespace es2sw ...@@ -59,7 +59,7 @@ namespace es2sw
unsigned int ConvertColorMask(bool red, bool green, bool blue, bool alpha); unsigned int ConvertColorMask(bool red, bool green, bool blue, bool alpha);
sw::MipmapType ConvertMipMapFilter(GLenum minFilter); sw::MipmapType ConvertMipMapFilter(GLenum minFilter);
sw::FilterType ConvertTextureFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy); sw::FilterType ConvertTextureFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy);
bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount, es1::PrimitiveType &swPrimitiveType, int &primitiveCount); bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount, GLenum elementType, sw::DrawType &swPrimitiveType, int &primitiveCount);
sw::Format ConvertRenderbufferFormat(GLenum format); sw::Format ConvertRenderbufferFormat(GLenum format);
sw::TextureStage::StageOperation ConvertCombineOperation(GLenum operation); sw::TextureStage::StageOperation ConvertCombineOperation(GLenum operation);
sw::TextureStage::SourceArgument ConvertSourceArgument(GLenum argument); sw::TextureStage::SourceArgument ConvertSourceArgument(GLenum argument);
......
...@@ -3436,10 +3436,10 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan ...@@ -3436,10 +3436,10 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
PrimitiveType primitiveType; sw::DrawType primitiveType;
int primitiveCount; int primitiveCount;
if(!es2sw::ConvertPrimitiveType(mode, count, primitiveType, primitiveCount)) if(!es2sw::ConvertPrimitiveType(mode, count, GL_NONE, primitiveType, primitiveCount))
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
if(primitiveCount <= 0) if(primitiveCount <= 0)
...@@ -3491,10 +3491,10 @@ void Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count, ...@@ -3491,10 +3491,10 @@ void Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count,
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
PrimitiveType primitiveType; sw::DrawType primitiveType;
int primitiveCount; int primitiveCount;
if(!es2sw::ConvertPrimitiveType(mode, count, primitiveType, primitiveCount)) if(!es2sw::ConvertPrimitiveType(mode, count, type, primitiveType, primitiveCount))
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
if(primitiveCount <= 0) if(primitiveCount <= 0)
...@@ -3537,7 +3537,7 @@ void Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count, ...@@ -3537,7 +3537,7 @@ void Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count,
if(!cullSkipsDraw(mode)) if(!cullSkipsDraw(mode))
{ {
device->drawIndexedPrimitive(primitiveType, indexInfo.indexOffset, primitiveCount, IndexDataManager::typeSize(type)); device->drawIndexedPrimitive(primitiveType, indexInfo.indexOffset, primitiveCount);
} }
} }
} }
......
...@@ -299,86 +299,26 @@ namespace es2 ...@@ -299,86 +299,26 @@ namespace es2
return surface; return surface;
} }
void Device::drawIndexedPrimitive(PrimitiveType type, unsigned int indexOffset, unsigned int primitiveCount, int indexSize) void Device::drawIndexedPrimitive(sw::DrawType type, unsigned int indexOffset, unsigned int primitiveCount)
{ {
if(!bindResources() || !primitiveCount) if(!bindResources() || !primitiveCount)
{ {
return; return;
} }
DrawType drawType; draw(type, indexOffset, primitiveCount);
if(indexSize == 4)
{
switch(type)
{
case DRAW_POINTLIST: drawType = sw::DRAW_INDEXEDPOINTLIST32; break;
case DRAW_LINELIST: drawType = sw::DRAW_INDEXEDLINELIST32; break;
case DRAW_LINESTRIP: drawType = sw::DRAW_INDEXEDLINESTRIP32; break;
case DRAW_LINELOOP: drawType = sw::DRAW_INDEXEDLINELOOP32; break;
case DRAW_TRIANGLELIST: drawType = sw::DRAW_INDEXEDTRIANGLELIST32; break;
case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_INDEXEDTRIANGLESTRIP32; break;
case DRAW_TRIANGLEFAN: drawType = sw::DRAW_INDEXEDTRIANGLEFAN32; break;
default: UNREACHABLE(type);
}
}
else if(indexSize == 2)
{
switch(type)
{
case DRAW_POINTLIST: drawType = sw::DRAW_INDEXEDPOINTLIST16; break;
case DRAW_LINELIST: drawType = sw::DRAW_INDEXEDLINELIST16; break;
case DRAW_LINESTRIP: drawType = sw::DRAW_INDEXEDLINESTRIP16; break;
case DRAW_LINELOOP: drawType = sw::DRAW_INDEXEDLINELOOP16; break;
case DRAW_TRIANGLELIST: drawType = sw::DRAW_INDEXEDTRIANGLELIST16; break;
case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_INDEXEDTRIANGLESTRIP16; break;
case DRAW_TRIANGLEFAN: drawType = sw::DRAW_INDEXEDTRIANGLEFAN16; break;
default: UNREACHABLE(type);
}
}
else if(indexSize == 1)
{
switch(type)
{
case DRAW_POINTLIST: drawType = sw::DRAW_INDEXEDPOINTLIST8; break;
case DRAW_LINELIST: drawType = sw::DRAW_INDEXEDLINELIST8; break;
case DRAW_LINESTRIP: drawType = sw::DRAW_INDEXEDLINESTRIP8; break;
case DRAW_LINELOOP: drawType = sw::DRAW_INDEXEDLINELOOP8; break;
case DRAW_TRIANGLELIST: drawType = sw::DRAW_INDEXEDTRIANGLELIST8; break;
case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_INDEXEDTRIANGLESTRIP8; break;
case DRAW_TRIANGLEFAN: drawType = sw::DRAW_INDEXEDTRIANGLEFAN8; break;
default: UNREACHABLE(type);
}
}
else UNREACHABLE(indexSize);
draw(drawType, indexOffset, primitiveCount);
} }
void Device::drawPrimitive(PrimitiveType primitiveType, unsigned int primitiveCount) void Device::drawPrimitive(sw::DrawType type, unsigned int primitiveCount)
{ {
if(!bindResources() || !primitiveCount) if(!bindResources() || !primitiveCount)
{ {
return; return;
} }
setIndexBuffer(0); setIndexBuffer(nullptr);
DrawType drawType;
switch(primitiveType)
{
case DRAW_POINTLIST: drawType = sw::DRAW_POINTLIST; break;
case DRAW_LINELIST: drawType = sw::DRAW_LINELIST; break;
case DRAW_LINESTRIP: drawType = sw::DRAW_LINESTRIP; break;
case DRAW_LINELOOP: drawType = sw::DRAW_LINELOOP; break;
case DRAW_TRIANGLELIST: drawType = sw::DRAW_TRIANGLELIST; break;
case DRAW_TRIANGLESTRIP: drawType = sw::DRAW_TRIANGLESTRIP; break;
case DRAW_TRIANGLEFAN: drawType = sw::DRAW_TRIANGLEFAN; break;
default: UNREACHABLE(primitiveType);
}
draw(drawType, 0, primitiveCount); draw(type, 0, primitiveCount);
} }
void Device::setDepthStencilSurface(egl::Image *depthStencil) void Device::setDepthStencilSurface(egl::Image *depthStencil)
......
...@@ -23,17 +23,6 @@ namespace es2 ...@@ -23,17 +23,6 @@ namespace es2
{ {
class Texture; class Texture;
enum PrimitiveType
{
DRAW_POINTLIST,
DRAW_LINELIST,
DRAW_LINESTRIP,
DRAW_LINELOOP,
DRAW_TRIANGLELIST,
DRAW_TRIANGLESTRIP,
DRAW_TRIANGLEFAN
};
struct Viewport struct Viewport
{ {
int x0; int x0;
...@@ -56,8 +45,8 @@ namespace es2 ...@@ -56,8 +45,8 @@ namespace es2
virtual void clearStencil(unsigned int stencil, unsigned int mask); virtual void clearStencil(unsigned int stencil, unsigned int mask);
virtual egl::Image *createDepthStencilSurface(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard); virtual egl::Image *createDepthStencilSurface(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
virtual egl::Image *createRenderTarget(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool lockable); virtual egl::Image *createRenderTarget(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool lockable);
virtual void drawIndexedPrimitive(PrimitiveType type, unsigned int indexOffset, unsigned int primitiveCount, int indexSize); virtual void drawIndexedPrimitive(sw::DrawType type, unsigned int indexOffset, unsigned int primitiveCount);
virtual void drawPrimitive(PrimitiveType primitiveType, unsigned int primiveCount); virtual void drawPrimitive(sw::DrawType type, unsigned int primiveCount);
virtual void setDepthStencilSurface(egl::Image *newDepthStencil); virtual void setDepthStencilSurface(egl::Image *newDepthStencil);
virtual void setPixelShader(sw::PixelShader *shader); virtual void setPixelShader(sw::PixelShader *shader);
virtual void setPixelShaderConstantF(unsigned int startRegister, const float *constantData, unsigned int count); virtual void setPixelShaderConstantF(unsigned int startRegister, const float *constantData, unsigned int count);
......
...@@ -1234,42 +1234,54 @@ namespace es2sw ...@@ -1234,42 +1234,54 @@ namespace es2sw
} }
} }
bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount, es2::PrimitiveType &swPrimitiveType, int &primitiveCount) bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount, GLenum elementType, sw::DrawType &drawType, int &primitiveCount)
{ {
switch(primitiveType) switch(primitiveType)
{ {
case GL_POINTS: case GL_POINTS:
swPrimitiveType = es2::DRAW_POINTLIST; drawType = sw::DRAW_POINTLIST;
primitiveCount = elementCount; primitiveCount = elementCount;
break; break;
case GL_LINES: case GL_LINES:
swPrimitiveType = es2::DRAW_LINELIST; drawType = sw::DRAW_LINELIST;
primitiveCount = elementCount / 2; primitiveCount = elementCount / 2;
break; break;
case GL_LINE_LOOP: case GL_LINE_LOOP:
swPrimitiveType = es2::DRAW_LINELOOP; drawType = sw::DRAW_LINELOOP;
primitiveCount = elementCount; primitiveCount = elementCount;
break; break;
case GL_LINE_STRIP: case GL_LINE_STRIP:
swPrimitiveType = es2::DRAW_LINESTRIP; drawType = sw::DRAW_LINESTRIP;
primitiveCount = elementCount - 1; primitiveCount = elementCount - 1;
break; break;
case GL_TRIANGLES: case GL_TRIANGLES:
swPrimitiveType = es2::DRAW_TRIANGLELIST; drawType = sw::DRAW_TRIANGLELIST;
primitiveCount = elementCount / 3; primitiveCount = elementCount / 3;
break; break;
case GL_TRIANGLE_STRIP: case GL_TRIANGLE_STRIP:
swPrimitiveType = es2::DRAW_TRIANGLESTRIP; drawType = sw::DRAW_TRIANGLESTRIP;
primitiveCount = elementCount - 2; primitiveCount = elementCount - 2;
break; break;
case GL_TRIANGLE_FAN: case GL_TRIANGLE_FAN:
swPrimitiveType = es2::DRAW_TRIANGLEFAN; drawType = sw::DRAW_TRIANGLEFAN;
primitiveCount = elementCount - 2; primitiveCount = elementCount - 2;
break; break;
default: default:
return false; return false;
} }
sw::DrawType elementSize;
switch(elementType)
{
case GL_NONE: elementSize = sw::DRAW_NONINDEXED; break;
case GL_UNSIGNED_BYTE: elementSize = sw::DRAW_INDEXED8; break;
case GL_UNSIGNED_SHORT: elementSize = sw::DRAW_INDEXED16; break;
case GL_UNSIGNED_INT: elementSize = sw::DRAW_INDEXED32; break;
default: return false;
}
drawType = sw::DrawType(drawType | elementSize);
return true; return true;
} }
......
...@@ -77,7 +77,7 @@ namespace es2sw ...@@ -77,7 +77,7 @@ namespace es2sw
unsigned int ConvertColorMask(bool red, bool green, bool blue, bool alpha); unsigned int ConvertColorMask(bool red, bool green, bool blue, bool alpha);
sw::MipmapType ConvertMipMapFilter(GLenum minFilter); sw::MipmapType ConvertMipMapFilter(GLenum minFilter);
sw::FilterType ConvertTextureFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy); sw::FilterType ConvertTextureFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy);
bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount, es2::PrimitiveType &swPrimitiveType, int &primitiveCount); bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount, GLenum elementType, sw::DrawType &swPrimitiveType, int &primitiveCount);
sw::Format ConvertRenderbufferFormat(GLenum format); sw::Format ConvertRenderbufferFormat(GLenum format);
} }
......
...@@ -51,38 +51,43 @@ namespace sw ...@@ -51,38 +51,43 @@ namespace sw
enum DrawType : unsigned int enum DrawType : unsigned int
{ {
DRAW_POINTLIST, DRAW_POINTLIST = 0x00,
DRAW_LINELIST, DRAW_LINELIST = 0x01,
DRAW_LINESTRIP, DRAW_LINESTRIP = 0x02,
DRAW_LINELOOP, DRAW_LINELOOP = 0x03,
DRAW_TRIANGLELIST, DRAW_TRIANGLELIST = 0x04,
DRAW_TRIANGLESTRIP, DRAW_TRIANGLESTRIP = 0x05,
DRAW_TRIANGLEFAN, DRAW_TRIANGLEFAN = 0x06,
DRAW_QUADLIST, DRAW_QUADLIST = 0x07,
DRAW_INDEXEDPOINTLIST8, DRAW_NONINDEXED = 0x00,
DRAW_INDEXEDLINELIST8, DRAW_INDEXED8 = 0x10,
DRAW_INDEXEDLINESTRIP8, DRAW_INDEXED16 = 0x20,
DRAW_INDEXEDLINELOOP8, DRAW_INDEXED32 = 0x30,
DRAW_INDEXEDTRIANGLELIST8,
DRAW_INDEXEDTRIANGLESTRIP8, DRAW_INDEXEDPOINTLIST8 = DRAW_POINTLIST | DRAW_INDEXED8,
DRAW_INDEXEDTRIANGLEFAN8, DRAW_INDEXEDLINELIST8 = DRAW_LINELIST | DRAW_INDEXED8,
DRAW_INDEXEDLINESTRIP8 = DRAW_LINESTRIP | DRAW_INDEXED8,
DRAW_INDEXEDPOINTLIST16, DRAW_INDEXEDLINELOOP8 = DRAW_LINELOOP | DRAW_INDEXED8,
DRAW_INDEXEDLINELIST16, DRAW_INDEXEDTRIANGLELIST8 = DRAW_TRIANGLELIST | DRAW_INDEXED8,
DRAW_INDEXEDLINESTRIP16, DRAW_INDEXEDTRIANGLESTRIP8 = DRAW_TRIANGLESTRIP | DRAW_INDEXED8,
DRAW_INDEXEDLINELOOP16, DRAW_INDEXEDTRIANGLEFAN8 = DRAW_TRIANGLEFAN | DRAW_INDEXED8,
DRAW_INDEXEDTRIANGLELIST16,
DRAW_INDEXEDTRIANGLESTRIP16, DRAW_INDEXEDPOINTLIST16 = DRAW_POINTLIST | DRAW_INDEXED16,
DRAW_INDEXEDTRIANGLEFAN16, DRAW_INDEXEDLINELIST16 = DRAW_LINELIST | DRAW_INDEXED16,
DRAW_INDEXEDLINESTRIP16 = DRAW_LINESTRIP | DRAW_INDEXED16,
DRAW_INDEXEDPOINTLIST32, DRAW_INDEXEDLINELOOP16 = DRAW_LINELOOP | DRAW_INDEXED16,
DRAW_INDEXEDLINELIST32, DRAW_INDEXEDTRIANGLELIST16 = DRAW_TRIANGLELIST | DRAW_INDEXED16,
DRAW_INDEXEDLINESTRIP32, DRAW_INDEXEDTRIANGLESTRIP16 = DRAW_TRIANGLESTRIP | DRAW_INDEXED16,
DRAW_INDEXEDLINELOOP32, DRAW_INDEXEDTRIANGLEFAN16 = DRAW_TRIANGLEFAN | DRAW_INDEXED16,
DRAW_INDEXEDTRIANGLELIST32,
DRAW_INDEXEDTRIANGLESTRIP32, DRAW_INDEXEDPOINTLIST32 = DRAW_POINTLIST | DRAW_INDEXED32,
DRAW_INDEXEDTRIANGLEFAN32, DRAW_INDEXEDLINELIST32 = DRAW_LINELIST | DRAW_INDEXED32,
DRAW_INDEXEDLINESTRIP32 = DRAW_LINESTRIP | DRAW_INDEXED32,
DRAW_INDEXEDLINELOOP32 = DRAW_LINELOOP | DRAW_INDEXED32,
DRAW_INDEXEDTRIANGLELIST32 = DRAW_TRIANGLELIST | DRAW_INDEXED32,
DRAW_INDEXEDTRIANGLESTRIP32 = DRAW_TRIANGLESTRIP | DRAW_INDEXED32,
DRAW_INDEXEDTRIANGLEFAN32 = DRAW_TRIANGLEFAN | DRAW_INDEXED32,
DRAW_LAST = DRAW_INDEXEDTRIANGLEFAN32 DRAW_LAST = DRAW_INDEXEDTRIANGLEFAN32
}; };
......
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