Store the shader bytecode in ShaderExecutable to pass it to CreateInputLayout.

TRAC #22191 Signed-off-by: Shannon Woods Signed-off-by: Daniel Koch Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1535 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 18adad0c
...@@ -1733,14 +1733,10 @@ bool ProgramBinary::save(void* binary, GLsizei bufSize, GLsizei *length) ...@@ -1733,14 +1733,10 @@ bool ProgramBinary::save(void* binary, GLsizei bufSize, GLsizei *length)
stream.write(mDxFrontCCWLocation); stream.write(mDxFrontCCWLocation);
stream.write(mDxPointsOrLinesLocation); stream.write(mDxPointsOrLinesLocation);
UINT pixelShaderSize; UINT pixelShaderSize = mPixelExecutable->getLength();
bool result = mPixelExecutable->getPixelFunction(NULL, &pixelShaderSize);
ASSERT(result);
stream.write(pixelShaderSize); stream.write(pixelShaderSize);
UINT vertexShaderSize; UINT vertexShaderSize = mVertexExecutable->getLength();
result = mVertexExecutable->getVertexFunction(NULL, &vertexShaderSize);
ASSERT(result);
stream.write(vertexShaderSize); stream.write(vertexShaderSize);
GUID identifier = mRenderer->getAdapterIdentifier(); GUID identifier = mRenderer->getAdapterIdentifier();
...@@ -1769,12 +1765,10 @@ bool ProgramBinary::save(void* binary, GLsizei bufSize, GLsizei *length) ...@@ -1769,12 +1765,10 @@ bool ProgramBinary::save(void* binary, GLsizei bufSize, GLsizei *length)
memcpy(ptr, &identifier, sizeof(GUID)); memcpy(ptr, &identifier, sizeof(GUID));
ptr += sizeof(GUID); ptr += sizeof(GUID);
result = mPixelExecutable->getPixelFunction(ptr, &pixelShaderSize); memcpy(ptr, mPixelExecutable->getFunction(), pixelShaderSize);
ASSERT(result);
ptr += pixelShaderSize; ptr += pixelShaderSize;
result = mVertexExecutable->getVertexFunction(ptr, &vertexShaderSize); memcpy(ptr, mVertexExecutable->getFunction(), vertexShaderSize);
ASSERT(result);
ptr += vertexShaderSize; ptr += vertexShaderSize;
ASSERT(ptr - totalLength == binary); ASSERT(ptr - totalLength == binary);
......
...@@ -161,7 +161,7 @@ class Renderer ...@@ -161,7 +161,7 @@ class Renderer
virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples, bool depth) = 0; virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples, bool depth) = 0;
// Shader operations // Shader operations
virtual ShaderExecutable *loadExecutable(const DWORD *function, size_t length, GLenum type, void *data) = 0; virtual ShaderExecutable *loadExecutable(const void *function, size_t length, GLenum type, void *data) = 0;
virtual ShaderExecutable *compileToExecutable(gl::InfoLog &infoLog, const char *shaderHLSL, GLenum type) = 0; virtual ShaderExecutable *compileToExecutable(gl::InfoLog &infoLog, const char *shaderHLSL, GLenum type) = 0;
protected: protected:
......
...@@ -683,8 +683,10 @@ GLenum Renderer11::applyVertexBuffer(gl::ProgramBinary *programBinary, gl::Verte ...@@ -683,8 +683,10 @@ GLenum Renderer11::applyVertexBuffer(gl::ProgramBinary *programBinary, gl::Verte
{"TEXCOORD", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0} {"TEXCOORD", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}
}; };
ShaderExecutable *vertexExecutable = programBinary->getVertexExecutable();
ID3D11InputLayout *inputLayout = NULL; ID3D11InputLayout *inputLayout = NULL;
result = mDevice->CreateInputLayout(inputElementDescriptions, 1, NULL /*FIXME: vertex shader blob */, 0 /* FIXME: vertex shader size */, &inputLayout); result = mDevice->CreateInputLayout(inputElementDescriptions, 1, vertexExecutable->getFunction(), vertexExecutable->getLength(), &inputLayout);
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
mDeviceContext->IASetInputLayout(inputLayout); mDeviceContext->IASetInputLayout(inputLayout);
...@@ -1178,7 +1180,7 @@ RenderTarget *Renderer11::createRenderTarget(int width, int height, GLenum forma ...@@ -1178,7 +1180,7 @@ RenderTarget *Renderer11::createRenderTarget(int width, int height, GLenum forma
return NULL; return NULL;
} }
ShaderExecutable *Renderer11::loadExecutable(const DWORD *function, size_t length, GLenum type, void *data) ShaderExecutable *Renderer11::loadExecutable(const void *function, size_t length, GLenum type, void *data)
{ {
ShaderExecutable11 *executable = NULL; ShaderExecutable11 *executable = NULL;
...@@ -1192,7 +1194,7 @@ ShaderExecutable *Renderer11::loadExecutable(const DWORD *function, size_t lengt ...@@ -1192,7 +1194,7 @@ ShaderExecutable *Renderer11::loadExecutable(const DWORD *function, size_t lengt
if (vshader) if (vshader)
{ {
executable = new ShaderExecutable11(vshader); executable = new ShaderExecutable11(function, length, vshader);
} }
} }
break; break;
...@@ -1204,7 +1206,7 @@ ShaderExecutable *Renderer11::loadExecutable(const DWORD *function, size_t lengt ...@@ -1204,7 +1206,7 @@ ShaderExecutable *Renderer11::loadExecutable(const DWORD *function, size_t lengt
if (pshader) if (pshader)
{ {
executable = new ShaderExecutable11(pshader); executable = new ShaderExecutable11(function, length, pshader);
} }
} }
break; break;
......
...@@ -129,7 +129,7 @@ class Renderer11 : public Renderer ...@@ -129,7 +129,7 @@ class Renderer11 : public Renderer
virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples, bool depth); virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples, bool depth);
// Shader operations // Shader operations
virtual ShaderExecutable *loadExecutable(const DWORD *function, size_t length, GLenum type, void *data); virtual ShaderExecutable *loadExecutable(const void *function, size_t length, GLenum type, void *data);
virtual ShaderExecutable *compileToExecutable(gl::InfoLog &infoLog, const char *shaderHLSL, GLenum type); virtual ShaderExecutable *compileToExecutable(gl::InfoLog &infoLog, const char *shaderHLSL, GLenum type);
// D3D11-renderer specific methods // D3D11-renderer specific methods
......
...@@ -2647,7 +2647,7 @@ RenderTarget *Renderer9::createRenderTarget(int width, int height, GLenum format ...@@ -2647,7 +2647,7 @@ RenderTarget *Renderer9::createRenderTarget(int width, int height, GLenum format
return renderTarget; return renderTarget;
} }
ShaderExecutable *Renderer9::loadExecutable(const DWORD *function, size_t length, GLenum type, void *data) ShaderExecutable *Renderer9::loadExecutable(const void *function, size_t length, GLenum type, void *data)
{ {
ShaderExecutable9 *executable = NULL; ShaderExecutable9 *executable = NULL;
gl::D3DConstantTable *table = reinterpret_cast<gl::D3DConstantTable *>(data); gl::D3DConstantTable *table = reinterpret_cast<gl::D3DConstantTable *>(data);
...@@ -2656,19 +2656,19 @@ ShaderExecutable *Renderer9::loadExecutable(const DWORD *function, size_t length ...@@ -2656,19 +2656,19 @@ ShaderExecutable *Renderer9::loadExecutable(const DWORD *function, size_t length
{ {
case GL_VERTEX_SHADER: case GL_VERTEX_SHADER:
{ {
IDirect3DVertexShader9 *vshader = createVertexShader(function, length); IDirect3DVertexShader9 *vshader = createVertexShader((DWORD*)function, length);
if (vshader) if (vshader)
{ {
executable = new ShaderExecutable9(vshader, table); executable = new ShaderExecutable9(function, length, vshader, table);
} }
} }
break; break;
case GL_FRAGMENT_SHADER: case GL_FRAGMENT_SHADER:
{ {
IDirect3DPixelShader9 *pshader = createPixelShader(function, length); IDirect3DPixelShader9 *pshader = createPixelShader((DWORD*)function, length);
if (pshader) if (pshader)
{ {
executable = new ShaderExecutable9(pshader, table); executable = new ShaderExecutable9(function, length, pshader, table);
} }
} }
break; break;
...@@ -2702,7 +2702,7 @@ ShaderExecutable *Renderer9::compileToExecutable(gl::InfoLog &infoLog, const cha ...@@ -2702,7 +2702,7 @@ ShaderExecutable *Renderer9::compileToExecutable(gl::InfoLog &infoLog, const cha
if (!binary) if (!binary)
return NULL; return NULL;
ShaderExecutable *executable = loadExecutable((DWORD *)binary->GetBufferPointer(), binary->GetBufferSize(), type, constantTable); ShaderExecutable *executable = loadExecutable(binary->GetBufferPointer(), binary->GetBufferSize(), type, constantTable);
binary->Release(); binary->Release();
return executable; return executable;
......
...@@ -168,7 +168,7 @@ class Renderer9 : public Renderer ...@@ -168,7 +168,7 @@ class Renderer9 : public Renderer
virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples, bool depth); virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples, bool depth);
// Shader operations // Shader operations
virtual ShaderExecutable *loadExecutable(const DWORD *function, size_t length, GLenum type, void *data); virtual ShaderExecutable *loadExecutable(const void *function, size_t length, GLenum type, void *data);
virtual ShaderExecutable *compileToExecutable(gl::InfoLog &infoLog, const char *shaderHLSL, GLenum type); virtual ShaderExecutable *compileToExecutable(gl::InfoLog &infoLog, const char *shaderHLSL, GLenum type);
// D3D9-renderer specific methods // D3D9-renderer specific methods
......
...@@ -19,16 +19,34 @@ namespace rx ...@@ -19,16 +19,34 @@ namespace rx
class ShaderExecutable class ShaderExecutable
{ {
public: public:
ShaderExecutable() {}; ShaderExecutable(const void *function, size_t length) : mLength(length)
virtual ~ShaderExecutable() {}; {
mFunction = new char[length];
virtual bool getVertexFunction(void *pData, UINT *pSizeOfData) = 0; memcpy(mFunction, function, length);
virtual bool getPixelFunction(void *pData, UINT *pSizeOfData) = 0; }
virtual ~ShaderExecutable()
{
delete mFunction;
}
void *getFunction() const
{
return mFunction;
}
size_t getLength() const
{
return mLength;
}
virtual gl::D3DConstantTable *getConstantTable() = 0; // D3D9_REMOVE virtual gl::D3DConstantTable *getConstantTable() = 0; // D3D9_REMOVE
private: private:
DISALLOW_COPY_AND_ASSIGN(ShaderExecutable); DISALLOW_COPY_AND_ASSIGN(ShaderExecutable);
void *mFunction;
const size_t mLength;
}; };
} }
......
...@@ -14,13 +14,15 @@ ...@@ -14,13 +14,15 @@
namespace rx namespace rx
{ {
ShaderExecutable11::ShaderExecutable11(ID3D11PixelShader *executable) ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11PixelShader *executable)
: ShaderExecutable(function, length)
{ {
mPixelExecutable = executable; mPixelExecutable = executable;
mVertexExecutable = NULL; mVertexExecutable = NULL;
} }
ShaderExecutable11::ShaderExecutable11(ID3D11VertexShader *executable) ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11VertexShader *executable)
: ShaderExecutable(function, length)
{ {
mVertexExecutable = executable; mVertexExecutable = executable;
mPixelExecutable = NULL; mPixelExecutable = NULL;
...@@ -44,20 +46,6 @@ ShaderExecutable11 *ShaderExecutable11::makeShaderExecutable11(ShaderExecutable ...@@ -44,20 +46,6 @@ ShaderExecutable11 *ShaderExecutable11::makeShaderExecutable11(ShaderExecutable
return static_cast<ShaderExecutable11*>(executable); return static_cast<ShaderExecutable11*>(executable);
} }
bool ShaderExecutable11::getVertexFunction(void *pData, UINT *pSizeOfData)
{
// TODO
UNIMPLEMENTED();
return false;
}
bool ShaderExecutable11::getPixelFunction(void *pData, UINT *pSizeOfData)
{
// TODO
UNIMPLEMENTED();
return false;
}
ID3D11VertexShader *ShaderExecutable11::getVertexShader() ID3D11VertexShader *ShaderExecutable11::getVertexShader()
{ {
return mVertexExecutable; return mVertexExecutable;
......
...@@ -20,12 +20,10 @@ namespace rx ...@@ -20,12 +20,10 @@ namespace rx
class ShaderExecutable11 : public ShaderExecutable class ShaderExecutable11 : public ShaderExecutable
{ {
public: public:
ShaderExecutable11(ID3D11PixelShader *executable); ShaderExecutable11(const void *function, size_t length, ID3D11PixelShader *executable);
ShaderExecutable11(ID3D11VertexShader *executable); ShaderExecutable11(const void *function, size_t length, ID3D11VertexShader *executable);
virtual ~ShaderExecutable11();
virtual bool getVertexFunction(void *pData, UINT *pSizeOfData); virtual ~ShaderExecutable11();
virtual bool getPixelFunction(void *pData, UINT *pSizeOfData);
static ShaderExecutable11 *makeShaderExecutable11(ShaderExecutable *executable); static ShaderExecutable11 *makeShaderExecutable11(ShaderExecutable *executable);
......
...@@ -14,14 +14,16 @@ ...@@ -14,14 +14,16 @@
namespace rx namespace rx
{ {
ShaderExecutable9::ShaderExecutable9(IDirect3DPixelShader9 *executable, gl::D3DConstantTable *constantTable) ShaderExecutable9::ShaderExecutable9(const void *function, size_t length, IDirect3DPixelShader9 *executable, gl::D3DConstantTable *constantTable)
: ShaderExecutable(function, length)
{ {
mPixelExecutable = executable; mPixelExecutable = executable;
mVertexExecutable = NULL; mVertexExecutable = NULL;
mConstantTable = constantTable; mConstantTable = constantTable;
} }
ShaderExecutable9::ShaderExecutable9(IDirect3DVertexShader9 *executable, gl::D3DConstantTable *constantTable) ShaderExecutable9::ShaderExecutable9(const void *function, size_t length, IDirect3DVertexShader9 *executable, gl::D3DConstantTable *constantTable)
: ShaderExecutable(function, length)
{ {
mVertexExecutable = executable; mVertexExecutable = executable;
mPixelExecutable = NULL; mPixelExecutable = NULL;
...@@ -48,26 +50,6 @@ ShaderExecutable9 *ShaderExecutable9::makeShaderExecutable9(ShaderExecutable *ex ...@@ -48,26 +50,6 @@ ShaderExecutable9 *ShaderExecutable9::makeShaderExecutable9(ShaderExecutable *ex
return static_cast<ShaderExecutable9*>(executable); return static_cast<ShaderExecutable9*>(executable);
} }
bool ShaderExecutable9::getVertexFunction(void *pData, UINT *pSizeOfData)
{
HRESULT hr = D3DERR_INVALIDCALL;
if (mVertexExecutable)
{
hr = mVertexExecutable->GetFunction(pData, pSizeOfData);
}
return SUCCEEDED(hr);
}
bool ShaderExecutable9::getPixelFunction(void *pData, UINT *pSizeOfData)
{
HRESULT hr = D3DERR_INVALIDCALL;
if (mPixelExecutable)
{
hr = mPixelExecutable->GetFunction(pData, pSizeOfData);
}
return SUCCEEDED(hr);
}
IDirect3DVertexShader9 *ShaderExecutable9::getVertexShader() IDirect3DVertexShader9 *ShaderExecutable9::getVertexShader()
{ {
return mVertexExecutable; return mVertexExecutable;
......
...@@ -21,13 +21,10 @@ namespace rx ...@@ -21,13 +21,10 @@ namespace rx
class ShaderExecutable9 : public ShaderExecutable class ShaderExecutable9 : public ShaderExecutable
{ {
public: public:
ShaderExecutable9(IDirect3DPixelShader9 *executable, gl::D3DConstantTable *constantTable); ShaderExecutable9(const void *function, size_t length, IDirect3DPixelShader9 *executable, gl::D3DConstantTable *constantTable);
ShaderExecutable9(IDirect3DVertexShader9 *executable, gl::D3DConstantTable *constantTable); ShaderExecutable9(const void *function, size_t length, IDirect3DVertexShader9 *executable, gl::D3DConstantTable *constantTable);
virtual ~ShaderExecutable9(); virtual ~ShaderExecutable9();
virtual bool getVertexFunction(void *pData, UINT *pSizeOfData);
virtual bool getPixelFunction(void *pData, UINT *pSizeOfData);
static ShaderExecutable9 *makeShaderExecutable9(ShaderExecutable *executable); static ShaderExecutable9 *makeShaderExecutable9(ShaderExecutable *executable);
IDirect3DPixelShader9 *getPixelShader(); IDirect3DPixelShader9 *getPixelShader();
......
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