Reimplement Direct3D GetFunction(). Copied from old Shader::GetFunction(). Bug 22533227 Change-Id: I587a4112bc97f75c010b6f572f8f4388d5af9225 Reviewed-on: https://swiftshader-review.googlesource.com/3734 Reviewed-by: Nicolas Capens <capn@google.com> Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/D3D9/Direct3DPixelShader9.cpp b/src/D3D9/Direct3DPixelShader9.cpp index ea86793..810c1fb 100644 --- a/src/D3D9/Direct3DPixelShader9.cpp +++ b/src/D3D9/Direct3DPixelShader9.cpp
@@ -18,10 +18,23 @@ { Direct3DPixelShader9::Direct3DPixelShader9(Direct3DDevice9 *device, const unsigned long *shaderToken) : device(device), pixelShader(shaderToken) { + tokenCount = 0; + + while(shaderToken[tokenCount] != 0x0000FFFF) + { + tokenCount += sw::Shader::size(shaderToken[tokenCount], (unsigned short)(shaderToken[0] & 0xFFFF)) + 1; + } + + tokenCount += 1; + + this->shaderToken = new unsigned long[tokenCount]; + memcpy(this->shaderToken, shaderToken, tokenCount * sizeof(unsigned long)); } Direct3DPixelShader9::~Direct3DPixelShader9() { + delete[] shaderToken; + shaderToken = 0; } long Direct3DPixelShader9::QueryInterface(const IID &iid, void **object) @@ -86,7 +99,12 @@ return INVALIDCALL(); } - UNIMPLEMENTED(); + if(data) + { + memcpy(data, shaderToken, tokenCount * 4); + } + + *size = tokenCount * 4; return D3D_OK; }
diff --git a/src/D3D9/Direct3DPixelShader9.hpp b/src/D3D9/Direct3DPixelShader9.hpp index a3f511e..312a6b7 100644 --- a/src/D3D9/Direct3DPixelShader9.hpp +++ b/src/D3D9/Direct3DPixelShader9.hpp
@@ -45,6 +45,9 @@ // Creation parameters Direct3DDevice9 *const device; + unsigned long *shaderToken; + int tokenCount; + sw::PixelShader pixelShader; }; }
diff --git a/src/D3D9/Direct3DVertexShader9.cpp b/src/D3D9/Direct3DVertexShader9.cpp index 2c4ece7..6a1220b 100644 --- a/src/D3D9/Direct3DVertexShader9.cpp +++ b/src/D3D9/Direct3DVertexShader9.cpp
@@ -18,10 +18,23 @@ { Direct3DVertexShader9::Direct3DVertexShader9(Direct3DDevice9 *device, const unsigned long *shaderToken) : device(device), vertexShader(shaderToken) { + tokenCount = 0; + + while(shaderToken[tokenCount] != 0x0000FFFF) + { + tokenCount += sw::Shader::size(shaderToken[tokenCount], (unsigned short)(shaderToken[0] & 0xFFFF)) + 1; + } + + tokenCount += 1; + + this->shaderToken = new unsigned long[tokenCount]; + memcpy(this->shaderToken, shaderToken, tokenCount * sizeof(unsigned long)); } Direct3DVertexShader9::~Direct3DVertexShader9() { + delete[] shaderToken; + shaderToken = 0; } long Direct3DVertexShader9::QueryInterface(const IID &iid, void **object) @@ -86,7 +99,12 @@ return INVALIDCALL(); } - UNIMPLEMENTED(); + if(data) + { + memcpy(data, shaderToken, tokenCount * 4); + } + + *size = tokenCount * 4; return D3D_OK; }
diff --git a/src/D3D9/Direct3DVertexShader9.hpp b/src/D3D9/Direct3DVertexShader9.hpp index da317a4..f582810 100644 --- a/src/D3D9/Direct3DVertexShader9.hpp +++ b/src/D3D9/Direct3DVertexShader9.hpp
@@ -45,6 +45,9 @@ // Creation parameters Direct3DDevice9 *const device; + unsigned long *shaderToken; + int tokenCount; + sw::VertexShader vertexShader; }; }