Make ProgramBinaries binary rather than text + binary.
Review URL: https://codereview.appspot.com/6351082
git-svn-id: https://angleproject.googlecode.com/svn/trunk@1215 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/ProgramBinary.cpp b/src/libGLESv2/ProgramBinary.cpp
index b5fb4e5..89313cf 100644
--- a/src/libGLESv2/ProgramBinary.cpp
+++ b/src/libGLESv2/ProgramBinary.cpp
@@ -7,8 +7,7 @@
// Program.cpp: Implements the gl::Program class. Implements GL program objects
// and related functionality. [OpenGL ES 2.0.24] section 2.10.3 page 28.
-#include <sstream>
-
+#include "libGLESv2/BinaryStream.h"
#include "libGLESv2/Program.h"
#include "libGLESv2/ProgramBinary.h"
@@ -1590,11 +1589,10 @@
bool ProgramBinary::load(InfoLog &infoLog, const void *binary, GLsizei length)
{
- std::istringstream stream((const char*) binary, length);
- stream >> std::boolalpha;
+ BinaryInputStream stream(binary, length);
int format = 0;
- stream >> format;
+ stream.read(&format);
if (format != GL_PROGRAM_BINARY_ANGLE)
{
infoLog.append("Invalid program binary format.");
@@ -1602,7 +1600,7 @@
}
int version = 0;
- stream >> version;
+ stream.read(&version);
if (version != BUILD_REVISION)
{
infoLog.append("Invalid program binary version.");
@@ -1611,39 +1609,39 @@
for (int i = 0; i < MAX_VERTEX_ATTRIBS; ++i)
{
- stream >> mLinkedAttribute[i].type;
+ stream.read(&mLinkedAttribute[i].type);
std::string name;
- stream >> name;
- mLinkedAttribute[i].name = name.substr(1, name.length() - 2);
- stream >> mSemanticIndex[i];
+ stream.read(&name);
+ mLinkedAttribute[i].name = name;
+ stream.read(&mSemanticIndex[i]);
}
for (unsigned int i = 0; i < MAX_TEXTURE_IMAGE_UNITS; ++i)
{
- stream >> mSamplersPS[i].active;
- stream >> mSamplersPS[i].logicalTextureUnit;
+ stream.read(&mSamplersPS[i].active);
+ stream.read(&mSamplersPS[i].logicalTextureUnit);
int textureType;
- stream >> textureType;
+ stream.read(&textureType);
mSamplersPS[i].textureType = (TextureType) textureType;
}
for (unsigned int i = 0; i < MAX_VERTEX_TEXTURE_IMAGE_UNITS_VTF; ++i)
{
- stream >> mSamplersVS[i].active;
- stream >> mSamplersVS[i].logicalTextureUnit;
+ stream.read(&mSamplersVS[i].active);
+ stream.read(&mSamplersVS[i].logicalTextureUnit);
int textureType;
- stream >> textureType;
+ stream.read(&textureType);
mSamplersVS[i].textureType = (TextureType) textureType;
}
- stream >> mUsedVertexSamplerRange;
- stream >> mUsedPixelSamplerRange;
+ stream.read(&mUsedVertexSamplerRange);
+ stream.read(&mUsedPixelSamplerRange);
unsigned int size;
- stream >> size;
- if (!stream.good())
+ stream.read(&size);
+ if (stream.error())
{
infoLog.append("Invalid program binary.");
return false;
@@ -1656,23 +1654,25 @@
std::string _name;
unsigned int arraySize;
- stream >> type >> _name >> arraySize;
+ stream.read(&type);
+ stream.read(&_name);
+ stream.read(&arraySize);
- mUniforms[i] = new Uniform(type, _name.substr(1, _name.length() - 2), arraySize);
+ mUniforms[i] = new Uniform(type, _name, arraySize);
- stream >> mUniforms[i]->ps.float4Index;
- stream >> mUniforms[i]->ps.samplerIndex;
- stream >> mUniforms[i]->ps.boolIndex;
- stream >> mUniforms[i]->ps.registerCount;
+ stream.read(&mUniforms[i]->ps.float4Index);
+ stream.read(&mUniforms[i]->ps.samplerIndex);
+ stream.read(&mUniforms[i]->ps.boolIndex);
+ stream.read(&mUniforms[i]->ps.registerCount);
- stream >> mUniforms[i]->vs.float4Index;
- stream >> mUniforms[i]->vs.samplerIndex;
- stream >> mUniforms[i]->vs.boolIndex;
- stream >> mUniforms[i]->vs.registerCount;
+ stream.read(&mUniforms[i]->vs.float4Index);
+ stream.read(&mUniforms[i]->vs.samplerIndex);
+ stream.read(&mUniforms[i]->vs.boolIndex);
+ stream.read(&mUniforms[i]->vs.registerCount);
}
- stream >> size;
- if (!stream.good())
+ stream.read(&size);
+ if (stream.error())
{
infoLog.append("Invalid program binary.");
return false;
@@ -1681,30 +1681,25 @@
mUniformIndex.resize(size);
for (unsigned int i = 0; i < size; ++i)
{
- std::string name;
- stream >> name;
- mUniformIndex[i].name = name.substr(1, name.length() - 2);
- stream >> mUniformIndex[i].element;
- stream >> mUniformIndex[i].index;
+ stream.read(&mUniformIndex[i].name);
+ stream.read(&mUniformIndex[i].element);
+ stream.read(&mUniformIndex[i].index);
}
- stream >> mDxDepthRangeLocation;
- stream >> mDxDepthLocation;
- stream >> mDxCoordLocation;
- stream >> mDxHalfPixelSizeLocation;
- stream >> mDxFrontCCWLocation;
- stream >> mDxPointsOrLinesLocation;
+ stream.read(&mDxDepthRangeLocation);
+ stream.read(&mDxDepthLocation);
+ stream.read(&mDxCoordLocation);
+ stream.read(&mDxHalfPixelSizeLocation);
+ stream.read(&mDxFrontCCWLocation);
+ stream.read(&mDxPointsOrLinesLocation);
unsigned int pixelShaderSize;
- stream >> pixelShaderSize;
+ stream.read(&pixelShaderSize);
unsigned int vertexShaderSize;
- stream >> vertexShaderSize;
+ stream.read(&vertexShaderSize);
- // Skip final newline.
- stream.ignore(1);
-
- const char *ptr = (const char*) binary + stream.tellg();
+ const char *ptr = (const char*) binary + stream.offset();
const D3DCAPS9 *binaryIdentifier = (const D3DCAPS9*) ptr;
ptr += sizeof(GUID);
@@ -1743,84 +1738,84 @@
bool ProgramBinary::save(void* binary, GLsizei bufSize, GLsizei *length)
{
- std::ostringstream stream;
- stream << std::boolalpha;
+ BinaryOutputStream stream;
- stream << GL_PROGRAM_BINARY_ANGLE << std::endl;
- stream << BUILD_REVISION << std::endl;
+ stream.write(GL_PROGRAM_BINARY_ANGLE);
+ stream.write(BUILD_REVISION);
for (unsigned int i = 0; i < MAX_VERTEX_ATTRIBS; ++i)
{
- stream << mLinkedAttribute[i].type << std::endl;
- stream << "\"" << mLinkedAttribute[i].name << "\"" << std::endl;
- stream << mSemanticIndex[i] << std::endl << std::endl;
+ stream.write(mLinkedAttribute[i].type);
+ stream.write(mLinkedAttribute[i].name);
+ stream.write(mSemanticIndex[i]);
}
for (unsigned int i = 0; i < MAX_TEXTURE_IMAGE_UNITS; ++i)
{
- stream << mSamplersPS[i].active << std::endl;
- stream << mSamplersPS[i].logicalTextureUnit << std::endl;
- stream << (int) mSamplersPS[i].textureType << std::endl << std::endl;
+ stream.write(mSamplersPS[i].active);
+ stream.write(mSamplersPS[i].logicalTextureUnit);
+ stream.write((int) mSamplersPS[i].textureType);
}
for (unsigned int i = 0; i < MAX_VERTEX_TEXTURE_IMAGE_UNITS_VTF; ++i)
{
- stream << mSamplersVS[i].active << std::endl;
- stream << mSamplersVS[i].logicalTextureUnit << std::endl;
- stream << (int) mSamplersVS[i].textureType << std::endl << std::endl;
+ stream.write(mSamplersVS[i].active);
+ stream.write(mSamplersVS[i].logicalTextureUnit);
+ stream.write((int) mSamplersVS[i].textureType);
}
- stream << mUsedVertexSamplerRange << std::endl;
- stream << mUsedPixelSamplerRange << std::endl << std::endl;
+ stream.write(mUsedVertexSamplerRange);
+ stream.write(mUsedPixelSamplerRange);
- stream << mUniforms.size() << std::endl;
+ stream.write(mUniforms.size());
for (unsigned int i = 0; i < mUniforms.size(); ++i)
{
- stream << mUniforms[i]->type << std::endl;
- stream << "\"" << mUniforms[i]->_name << "\"" << std::endl;
- stream << mUniforms[i]->arraySize << std::endl << std::endl;
+ stream.write(mUniforms[i]->type);
+ stream.write(mUniforms[i]->_name);
+ stream.write(mUniforms[i]->arraySize);
- stream << mUniforms[i]->ps.float4Index << std::endl;
- stream << mUniforms[i]->ps.samplerIndex << std::endl;
- stream << mUniforms[i]->ps.boolIndex << std::endl;
- stream << mUniforms[i]->ps.registerCount << std::endl;
+ stream.write(mUniforms[i]->ps.float4Index);
+ stream.write(mUniforms[i]->ps.samplerIndex);
+ stream.write(mUniforms[i]->ps.boolIndex);
+ stream.write(mUniforms[i]->ps.registerCount);
- stream << mUniforms[i]->vs.float4Index << std::endl;
- stream << mUniforms[i]->vs.samplerIndex << std::endl;
- stream << mUniforms[i]->vs.boolIndex << std::endl;
- stream << mUniforms[i]->vs.registerCount << std::endl;
+ stream.write(mUniforms[i]->vs.float4Index);
+ stream.write(mUniforms[i]->vs.samplerIndex);
+ stream.write(mUniforms[i]->vs.boolIndex);
+ stream.write(mUniforms[i]->vs.registerCount);
}
- stream << mUniformIndex.size() << std::endl;
+ stream.write(mUniformIndex.size());
for (unsigned int i = 0; i < mUniformIndex.size(); ++i)
{
- stream << "\"" << mUniformIndex[i].name << "\"" << std::endl;
- stream << mUniformIndex[i].element << std::endl;
- stream << mUniformIndex[i].index << std::endl << std::endl;
+ stream.write(mUniformIndex[i].name);
+ stream.write(mUniformIndex[i].element);
+ stream.write(mUniformIndex[i].index);
}
- stream << mDxDepthRangeLocation << std::endl;
- stream << mDxDepthLocation << std::endl;
- stream << mDxCoordLocation << std::endl;
- stream << mDxHalfPixelSizeLocation << std::endl;
- stream << mDxFrontCCWLocation << std::endl;
- stream << mDxPointsOrLinesLocation << std::endl;
+ stream.write(mDxDepthRangeLocation);
+ stream.write(mDxDepthLocation);
+ stream.write(mDxCoordLocation);
+ stream.write(mDxHalfPixelSizeLocation);
+ stream.write(mDxFrontCCWLocation);
+ stream.write(mDxPointsOrLinesLocation);
UINT pixelShaderSize;
HRESULT result = mPixelExecutable->GetFunction(NULL, &pixelShaderSize);
ASSERT(SUCCEEDED(result));
- stream << pixelShaderSize << std::endl;
+ stream.write(pixelShaderSize);
UINT vertexShaderSize;
result = mVertexExecutable->GetFunction(NULL, &vertexShaderSize);
ASSERT(SUCCEEDED(result));
- stream << vertexShaderSize << std::endl;
-
- std::string text = stream.str();
+ stream.write(vertexShaderSize);
D3DADAPTER_IDENTIFIER9 *identifier = getDisplay()->getAdapterIdentifier();
- GLsizei totalLength = text.length() + sizeof(GUID) + pixelShaderSize + vertexShaderSize;
+ GLsizei streamLength = stream.length();
+ const void *streamData = stream.data();
+
+ GLsizei totalLength = streamLength + sizeof(GUID) + pixelShaderSize + vertexShaderSize;
if (totalLength > bufSize)
{
if (length)
@@ -1835,8 +1830,8 @@
{
char *ptr = (char*) binary;
- memcpy(ptr, text.c_str(), text.length());
- ptr += text.length();
+ memcpy(ptr, streamData, streamLength);
+ ptr += streamLength;
memcpy(ptr, &identifier->DeviceIdentifier, sizeof(GUID));
ptr += sizeof(GUID);