Store ShaderExecutables on the ProgramBinary instead of d3d9 shaders

Trac #22155 Signed-off-by: Geoff Lang Signed-off-by: Nicolas Capens Also hooks up binary loading to the loadExecutable function. The other notable change is that getVertex/Pixel shader no longer add reference counts to the returned objects. git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1505 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 5531890f
......@@ -96,15 +96,8 @@ ProgramBinary::ProgramBinary(rx::Renderer *renderer) : RefCountObject(0), mSeria
ProgramBinary::~ProgramBinary()
{
if (mPixelExecutable)
{
mPixelExecutable->Release();
}
if (mVertexExecutable)
{
mVertexExecutable->Release();
}
delete mPixelExecutable;
delete mVertexExecutable;
while (!mUniforms.empty())
{
......@@ -123,12 +116,12 @@ unsigned int ProgramBinary::issueSerial()
return mCurrentSerial++;
}
IDirect3DPixelShader9 *ProgramBinary::getPixelShader()
rx::ShaderExecutable *ProgramBinary::getPixelExecutable()
{
return mPixelExecutable;
}
IDirect3DVertexShader9 *ProgramBinary::getVertexShader()
rx::ShaderExecutable *ProgramBinary::getVertexExecutable()
{
return mVertexExecutable;
}
......@@ -1650,21 +1643,26 @@ bool ProgramBinary::load(InfoLog &infoLog, const void *binary, GLsizei length)
const char *vertexShaderFunction = ptr;
ptr += vertexShaderSize;
mPixelExecutable = mRenderer->createPixelShader(reinterpret_cast<const DWORD*>(pixelShaderFunction), pixelShaderSize);
if (!mPixelExecutable)
rx::ShaderExecutable *executable;
executable = mRenderer->loadExecutable(reinterpret_cast<const DWORD*>(pixelShaderFunction),
pixelShaderSize, GL_FRAGMENT_SHADER, NULL);
if (!executable)
{
infoLog.append("Could not create pixel shader.");
return false;
}
mPixelExecutable = rx::ShaderExecutable9::makeShaderExecutable9(executable);
mVertexExecutable = mRenderer->createVertexShader(reinterpret_cast<const DWORD*>(vertexShaderFunction), vertexShaderSize);
if (!mVertexExecutable)
executable = mRenderer->loadExecutable(reinterpret_cast<const DWORD*>(vertexShaderFunction),
vertexShaderSize, GL_VERTEX_SHADER, NULL);
if (!executable)
{
infoLog.append("Could not create vertex shader.");
mPixelExecutable->Release();
delete mPixelExecutable;
mPixelExecutable = NULL;
return false;
}
mVertexExecutable = rx::ShaderExecutable9::makeShaderExecutable9(executable);
return true;
}
......@@ -1734,12 +1732,12 @@ bool ProgramBinary::save(void* binary, GLsizei bufSize, GLsizei *length)
stream.write(mDxPointsOrLinesLocation);
UINT pixelShaderSize;
HRESULT result = mPixelExecutable->GetFunction(NULL, &pixelShaderSize);
HRESULT result = mPixelExecutable->getPixelShader()->GetFunction(NULL, &pixelShaderSize);
ASSERT(SUCCEEDED(result));
stream.write(pixelShaderSize);
UINT vertexShaderSize;
result = mVertexExecutable->GetFunction(NULL, &vertexShaderSize);
result = mVertexExecutable->getVertexShader()->GetFunction(NULL, &vertexShaderSize);
ASSERT(SUCCEEDED(result));
stream.write(vertexShaderSize);
......@@ -1769,11 +1767,11 @@ bool ProgramBinary::save(void* binary, GLsizei bufSize, GLsizei *length)
memcpy(ptr, &identifier, sizeof(GUID));
ptr += sizeof(GUID);
result = mPixelExecutable->GetFunction(ptr, &pixelShaderSize);
result = mPixelExecutable->getPixelShader()->GetFunction(ptr, &pixelShaderSize);
ASSERT(SUCCEEDED(result));
ptr += pixelShaderSize;
result = mVertexExecutable->GetFunction(ptr, &vertexShaderSize);
result = mVertexExecutable->getVertexShader()->GetFunction(ptr, &vertexShaderSize);
ASSERT(SUCCEEDED(result));
ptr += vertexShaderSize;
......@@ -1829,27 +1827,21 @@ bool ProgramBinary::link(InfoLog &infoLog, const AttributeBindings &attributeBin
if (vertexExecutable && pixelExecutable)
{
rx::ShaderExecutable9 *vshader9 = rx::ShaderExecutable9::makeShaderExecutable9(vertexExecutable);
rx::ShaderExecutable9 *pshader9 = rx::ShaderExecutable9::makeShaderExecutable9(pixelExecutable);
mVertexExecutable = vshader9->getVertexShader();
mPixelExecutable = pshader9->getPixelShader();
mVertexExecutable = rx::ShaderExecutable9::makeShaderExecutable9(vertexExecutable);
mPixelExecutable = rx::ShaderExecutable9::makeShaderExecutable9(pixelExecutable);
if (!mPixelExecutable || !mVertexExecutable)
{
if (mVertexExecutable) mVertexExecutable->Release();
mVertexExecutable = NULL;
if (mPixelExecutable) mPixelExecutable->Release();
mPixelExecutable = NULL;
infoLog.append("Failed to create D3D shaders.");
success = false;
}
constantTableVS = vshader9->getConstantTable();
constantTablePS = pshader9->getConstantTable();
constantTableVS = mVertexExecutable->getConstantTable();
constantTablePS = mPixelExecutable->getConstantTable();
}
else
{
infoLog.append("Failed to create D3D shaders.");
success = false;
delete vertexExecutable;
vertexExecutable = NULL;
delete pixelExecutable;
pixelExecutable = NULL;
}
if (!linkAttributes(infoLog, attributeBindings, fragmentShader, vertexShader))
......@@ -1864,8 +1856,6 @@ bool ProgramBinary::link(InfoLog &infoLog, const AttributeBindings &attributeBin
success = false;
}
}
delete vertexExecutable;
delete pixelExecutable;
// these uniforms are searched as already-decorated because gl_ and dx_
// are reserved prefixes, and do not receive additional decoration
......
......@@ -104,8 +104,8 @@ class ProgramBinary : public RefCountObject
explicit ProgramBinary(rx::Renderer *renderer);
~ProgramBinary();
IDirect3DPixelShader9 *getPixelShader();
IDirect3DVertexShader9 *getVertexShader();
rx::ShaderExecutable *getPixelExecutable();
rx::ShaderExecutable *getVertexExecutable();
GLuint getAttributeLocation(const char *name);
int getSemanticIndex(int attributeIndex);
......@@ -189,8 +189,8 @@ class ProgramBinary : public RefCountObject
rx::Renderer9 *mRenderer; // D3D9_REPLACE
IDirect3DDevice9 *mDevice; // D3D9_REPLACE
IDirect3DPixelShader9 *mPixelExecutable; // D3D9_REPLACE
IDirect3DVertexShader9 *mVertexExecutable; // D3D9_REPLACE
rx::ShaderExecutable9 *mPixelExecutable; // D3D9_REPLACE
rx::ShaderExecutable9 *mVertexExecutable; // D3D9_REPLACE
Attribute mLinkedAttribute[MAX_VERTEX_ATTRIBS];
int mSemanticIndex[MAX_VERTEX_ATTRIBS];
......
......@@ -1377,8 +1377,14 @@ void Renderer9::drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices,
void Renderer9::applyShaders(gl::ProgramBinary *programBinary)
{
IDirect3DVertexShader9 *vertexShader = programBinary->getVertexShader();
IDirect3DPixelShader9 *pixelShader = programBinary->getPixelShader();
ShaderExecutable *vertexExe = programBinary->getVertexExecutable();
ShaderExecutable *pixelExe = programBinary->getPixelExecutable();
IDirect3DVertexShader9 *vertexShader = NULL;
if (vertexExe) vertexShader = ShaderExecutable9::makeShaderExecutable9(vertexExe)->getVertexShader();
IDirect3DPixelShader9 *pixelShader = NULL;
if (pixelExe) pixelShader = ShaderExecutable9::makeShaderExecutable9(pixelExe)->getPixelShader();
mDevice->SetPixelShader(pixelShader);
mDevice->SetVertexShader(vertexShader);
......
......@@ -50,23 +50,11 @@ ShaderExecutable9 *ShaderExecutable9::makeShaderExecutable9(ShaderExecutable *ex
IDirect3DVertexShader9 *ShaderExecutable9::getVertexShader()
{
// Caller is responsible for releasing the returned shader reference.
if (mVertexExecutable)
{
mVertexExecutable->AddRef();
}
return mVertexExecutable;
}
IDirect3DPixelShader9 *ShaderExecutable9::getPixelShader()
{
// Caller is responsible for releasing the returned shader reference.
if (mPixelExecutable)
{
mPixelExecutable->AddRef();
}
return mPixelExecutable;
}
......
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