Add loadExecutable function to Renderer
Trac #22155
Signed-off-by: Geoff Lang
Signed-off-by: Nicolas Capens
factored out of compileToExecutable as we also need this when loading binaries from disk.
git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1504 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/renderer/Renderer.h b/src/libGLESv2/renderer/Renderer.h
index ab2e253..35071be 100644
--- a/src/libGLESv2/renderer/Renderer.h
+++ b/src/libGLESv2/renderer/Renderer.h
@@ -163,6 +163,7 @@
virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples, bool depth) = 0;
// Shader operations
+ virtual ShaderExecutable *loadExecutable(const DWORD *function, size_t length, GLenum type, void *data) = 0;
virtual ShaderExecutable *compileToExecutable(gl::InfoLog &infoLog, const char *shaderHLSL, GLenum type) = 0;
protected:
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index 414208d..593e741 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -829,6 +829,13 @@
return NULL;
}
+ShaderExecutable *Renderer11::loadExecutable(const DWORD *function, size_t length, GLenum type, void *data)
+{
+ // TODO
+ UNIMPLEMENTED();
+ return NULL;
+}
+
ShaderExecutable *Renderer11::compileToExecutable(gl::InfoLog &infoLog, const char *shaderHLSL, GLenum type)
{
// TODO
diff --git a/src/libGLESv2/renderer/Renderer11.h b/src/libGLESv2/renderer/Renderer11.h
index ef567aa..c3dc89a 100644
--- a/src/libGLESv2/renderer/Renderer11.h
+++ b/src/libGLESv2/renderer/Renderer11.h
@@ -130,6 +130,7 @@
virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples, bool depth);
// Shader operations
+ virtual ShaderExecutable *loadExecutable(const DWORD *function, size_t length, GLenum type, void *data);
virtual ShaderExecutable *compileToExecutable(gl::InfoLog &infoLog, const char *shaderHLSL, GLenum type);
// D3D11-renderer specific methods
diff --git a/src/libGLESv2/renderer/Renderer9.cpp b/src/libGLESv2/renderer/Renderer9.cpp
index f2e1350..d091d49 100644
--- a/src/libGLESv2/renderer/Renderer9.cpp
+++ b/src/libGLESv2/renderer/Renderer9.cpp
@@ -2632,6 +2632,39 @@
return renderTarget;
}
+ShaderExecutable *Renderer9::loadExecutable(const DWORD *function, size_t length, GLenum type, void *data)
+{
+ ShaderExecutable9 *executable = NULL;
+ gl::D3DConstantTable *table = reinterpret_cast<gl::D3DConstantTable *>(data);
+
+ switch (type)
+ {
+ case GL_VERTEX_SHADER:
+ {
+ IDirect3DVertexShader9 *vshader = createVertexShader(function, length);
+ if (vshader)
+ {
+ executable = new ShaderExecutable9(vshader, table);
+ }
+ }
+ break;
+ case GL_FRAGMENT_SHADER:
+ {
+ IDirect3DPixelShader9 *pshader = createPixelShader(function, length);
+ if (pshader)
+ {
+ executable = new ShaderExecutable9(pshader, table);
+ }
+ }
+ break;
+ default:
+ UNREACHABLE();
+ break;
+ }
+
+ return executable;
+}
+
ShaderExecutable *Renderer9::compileToExecutable(gl::InfoLog &infoLog, const char *shaderHLSL, GLenum type)
{
const char *profile = NULL;
@@ -2654,32 +2687,7 @@
if (!binary)
return NULL;
- ShaderExecutable9 *executable = NULL;
-
- switch (type)
- {
- case GL_VERTEX_SHADER:
- {
- IDirect3DVertexShader9 *vshader = createVertexShader((DWORD *)binary->GetBufferPointer(), binary->GetBufferSize());
- if (vshader)
- {
- executable = new ShaderExecutable9(vshader, constantTable);
- }
- }
- break;
- case GL_FRAGMENT_SHADER:
- {
- IDirect3DPixelShader9 *pshader = createPixelShader((DWORD *)binary->GetBufferPointer(), binary->GetBufferSize());
- if (pshader)
- {
- executable = new ShaderExecutable9(pshader, constantTable);
- }
- }
- break;
- default:
- UNREACHABLE();
- break;
- }
+ ShaderExecutable *executable = loadExecutable((DWORD *)binary->GetBufferPointer(), binary->GetBufferSize(), type, constantTable);
return executable;
}
diff --git a/src/libGLESv2/renderer/Renderer9.h b/src/libGLESv2/renderer/Renderer9.h
index f07cd1c..04293f8 100644
--- a/src/libGLESv2/renderer/Renderer9.h
+++ b/src/libGLESv2/renderer/Renderer9.h
@@ -171,6 +171,7 @@
virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples, bool depth);
// Shader operations
+ virtual ShaderExecutable *loadExecutable(const DWORD *function, size_t length, GLenum type, void *data);
virtual ShaderExecutable *compileToExecutable(gl::InfoLog &infoLog, const char *shaderHLSL, GLenum type);
// D3D9-renderer specific methods