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