Move shader cache into Renderer

Trac #21727 git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1333 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent f688c0d1
......@@ -253,6 +253,7 @@
'libGLESv2/Renderbuffer.h',
'libGLESv2/renderer/Renderer.cpp',
'libGLESv2/renderer/Renderer.h',
'libGLESv2/renderer/ShaderCache.h',
'libGLESv2/ResourceManager.cpp',
'libGLESv2/ResourceManager.h',
'libGLESv2/Shader.cpp',
......
......@@ -212,9 +212,6 @@ bool Display::initialize()
initExtensionString();
mVertexShaderCache.initialize(device);
mPixelShaderCache.initialize(device);
return true;
}
......@@ -230,9 +227,6 @@ void Display::terminate()
destroyContext(*mContextSet.begin());
}
mVertexShaderCache.clear();
mPixelShaderCache.clear();
glDestroyRenderer(mRenderer);
mRenderer = NULL;
}
......@@ -497,9 +491,6 @@ bool Display::restoreLostDevice()
(*surface)->release();
}
mVertexShaderCache.clear();
mPixelShaderCache.clear();
if (!mRenderer->resetDevice())
{
return error(EGL_BAD_ALLOC, false);
......@@ -622,15 +613,5 @@ const char *Display::getExtensionString() const
return mExtensionString.c_str();
}
IDirect3DVertexShader9 *Display::createVertexShader(const DWORD *function, size_t length)
{
return mVertexShaderCache.create(function, length);
}
IDirect3DPixelShader9 *Display::createPixelShader(const DWORD *function, size_t length)
{
return mPixelShaderCache.create(function, length);
}
}
......@@ -24,7 +24,6 @@
#include "libGLESv2/renderer/Renderer.h"
#include "libEGL/Config.h"
#include "libEGL/ShaderCache.h"
#include "libEGL/Surface.h"
namespace egl
......@@ -64,9 +63,6 @@ class Display
const char *getExtensionString() const;
virtual IDirect3DVertexShader9 *createVertexShader(const DWORD *function, size_t length);
virtual IDirect3DPixelShader9 *createPixelShader(const DWORD *function, size_t length);
private:
DISALLOW_COPY_AND_ASSIGN(Display);
......@@ -77,9 +73,6 @@ class Display
EGLNativeDisplayType mDisplayId;
const HDC mDc;
VertexShaderCache mVertexShaderCache;
PixelShaderCache mPixelShaderCache;
EGLint mMaxSwapInterval;
EGLint mMinSwapInterval;
bool mSoftwareDevice;
......
......@@ -42,8 +42,8 @@ const size_t g_shaderSize[] =
namespace gl
{
Blit::Blit(Context *context)
: mContext(context), mQuadVertexBuffer(NULL), mQuadVertexDeclaration(NULL), mSavedRenderTarget(NULL), mSavedDepthStencil(NULL), mSavedStateBlock(NULL)
Blit::Blit(renderer::Renderer *renderer)
: mRenderer(renderer), mQuadVertexBuffer(NULL), mQuadVertexDeclaration(NULL), mSavedRenderTarget(NULL), mSavedDepthStencil(NULL), mSavedStateBlock(NULL)
{
initGeometry();
memset(mCompiledShaders, 0, sizeof(mCompiledShaders));
......@@ -75,7 +75,7 @@ void Blit::initGeometry()
1, 1
};
IDirect3DDevice9 *device = getDevice();
IDirect3DDevice9 *device = mRenderer->getDevice();
HRESULT result = device->CreateVertexBuffer(sizeof(quad), D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, &mQuadVertexBuffer, NULL);
......@@ -114,11 +114,10 @@ void Blit::initGeometry()
template <class D3DShaderType>
bool Blit::setShader(ShaderId source, const char *profile,
D3DShaderType *(egl::Display::*createShader)(const DWORD *, size_t length),
D3DShaderType *(renderer::Renderer::*createShader)(const DWORD *, size_t length),
HRESULT (WINAPI IDirect3DDevice9::*setShader)(D3DShaderType*))
{
egl::Display *display = getDisplay();
IDirect3DDevice9 *device = display->getRenderer()->getDevice(); // D3D9_REPLACE
IDirect3DDevice9 *device = mRenderer->getDevice(); // D3D9_REPLACE
D3DShaderType *shader;
......@@ -131,7 +130,7 @@ bool Blit::setShader(ShaderId source, const char *profile,
const BYTE* shaderCode = g_shaderCode[source];
size_t shaderSize = g_shaderSize[source];
shader = (display->*createShader)(reinterpret_cast<const DWORD*>(shaderCode), shaderSize);
shader = (mRenderer->*createShader)(reinterpret_cast<const DWORD*>(shaderCode), shaderSize);
if (!shader)
{
ERR("Failed to create shader for blit operation");
......@@ -154,12 +153,12 @@ bool Blit::setShader(ShaderId source, const char *profile,
bool Blit::setVertexShader(ShaderId shader)
{
return setShader<IDirect3DVertexShader9>(shader, "vs_2_0", &egl::Display::createVertexShader, &IDirect3DDevice9::SetVertexShader);
return setShader<IDirect3DVertexShader9>(shader, "vs_2_0", &renderer::Renderer::createVertexShader, &IDirect3DDevice9::SetVertexShader);
}
bool Blit::setPixelShader(ShaderId shader)
{
return setShader<IDirect3DPixelShader9>(shader, "ps_2_0", &egl::Display::createPixelShader, &IDirect3DDevice9::SetPixelShader);
return setShader<IDirect3DPixelShader9>(shader, "ps_2_0", &renderer::Renderer::createPixelShader, &IDirect3DDevice9::SetPixelShader);
}
RECT Blit::getSurfaceRect(IDirect3DSurface9 *surface) const
......@@ -185,7 +184,7 @@ bool Blit::boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest)
}
// D3D9_REPLACE
IDirect3DDevice9 *device = getDevice();
IDirect3DDevice9 *device = mRenderer->getDevice();
saveState();
......@@ -213,7 +212,7 @@ bool Blit::boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest)
bool Blit::copy(IDirect3DSurface9 *source, const RECT &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, IDirect3DSurface9 *dest)
{
// D3D9_REPLACE
IDirect3DDevice9 *device = getDevice();
IDirect3DDevice9 *device = mRenderer->getDevice();
D3DSURFACE_DESC sourceDesc;
D3DSURFACE_DESC destDesc;
......@@ -249,7 +248,7 @@ bool Blit::formatConvert(IDirect3DSurface9 *source, const RECT &sourceRect, GLen
}
// D3D9_REPLACE
IDirect3DDevice9 *device = getDevice();
IDirect3DDevice9 *device = mRenderer->getDevice();
saveState();
......@@ -329,7 +328,7 @@ bool Blit::setFormatConvertShaders(GLenum destFormat)
break;
}
getDevice()->SetPixelShaderConstantF(0, psConst0, 1);
mRenderer->getDevice()->SetPixelShaderConstantF(0, psConst0, 1); // D3D9_REPLACE
return true;
}
......@@ -342,9 +341,7 @@ IDirect3DTexture9 *Blit::copySurfaceToTexture(IDirect3DSurface9 *surface, const
return NULL;
}
egl::Display *display = getDisplay();
renderer::Renderer *renderer = display->getRenderer();
IDirect3DDevice9 *device = renderer->getDevice(); // D3D9_REPLACE
IDirect3DDevice9 *device = mRenderer->getDevice(); // D3D9_REPLACE
D3DSURFACE_DESC sourceDesc;
surface->GetDesc(&sourceDesc);
......@@ -369,7 +366,7 @@ IDirect3DTexture9 *Blit::copySurfaceToTexture(IDirect3DSurface9 *surface, const
return error(GL_OUT_OF_MEMORY, (IDirect3DTexture9*)NULL);
}
renderer->endScene();
mRenderer->endScene();
result = device->StretchRect(surface, &sourceRect, textureSurface, NULL, D3DTEXF_NONE);
textureSurface->Release();
......@@ -386,7 +383,7 @@ IDirect3DTexture9 *Blit::copySurfaceToTexture(IDirect3DSurface9 *surface, const
void Blit::setViewport(const RECT &sourceRect, GLint xoffset, GLint yoffset)
{
IDirect3DDevice9 *device = getDevice(); // D3D9_REPLACE
IDirect3DDevice9 *device = mRenderer->getDevice(); // D3D9_REPLACE
D3DVIEWPORT9 vp;
vp.X = xoffset;
......@@ -404,7 +401,7 @@ void Blit::setViewport(const RECT &sourceRect, GLint xoffset, GLint yoffset)
// D3D9_REPLACE
void Blit::setCommonBlitState()
{
IDirect3DDevice9 *device = getDevice();
IDirect3DDevice9 *device = mRenderer->getDevice();
device->SetDepthStencilSurface(NULL);
......@@ -435,21 +432,19 @@ void Blit::setCommonBlitState()
// D3D9_REPLACE
void Blit::render()
{
egl::Display *display = getDisplay();
renderer::Renderer *renderer = display->getRenderer();
IDirect3DDevice9 *device = renderer->getDevice();
IDirect3DDevice9 *device = mRenderer->getDevice();
HRESULT hr = device->SetStreamSource(0, mQuadVertexBuffer, 0, 2 * sizeof(float));
hr = device->SetVertexDeclaration(mQuadVertexDeclaration);
renderer->startScene();
mRenderer->startScene();
hr = device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
}
// D3D9_REPLACE
void Blit::saveState()
{
IDirect3DDevice9 *device = getDevice();
IDirect3DDevice9 *device = mRenderer->getDevice();
HRESULT hr;
......@@ -502,7 +497,7 @@ void Blit::saveState()
// D3D9_REPLACE
void Blit::restoreState()
{
IDirect3DDevice9 *device = getDevice();
IDirect3DDevice9 *device = mRenderer->getDevice();
device->SetDepthStencilSurface(mSavedDepthStencil);
if (mSavedDepthStencil != NULL)
......
......@@ -27,7 +27,7 @@ class Context;
class Blit
{
public:
explicit Blit(Context *context);
explicit Blit(renderer::Renderer *renderer);
~Blit();
// Copy from source surface to dest surface.
......@@ -44,7 +44,7 @@ class Blit
bool boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest);
private:
Context *mContext;
renderer::Renderer *mRenderer;
IDirect3DVertexBuffer9 *mQuadVertexBuffer;
IDirect3DVertexDeclaration9 *mQuadVertexDeclaration;
......@@ -74,7 +74,7 @@ class Blit
template <class D3DShaderType>
bool setShader(ShaderId source, const char *profile,
D3DShaderType *(egl::Display::*createShader)(const DWORD *, size_t length),
D3DShaderType *(renderer::Renderer::*createShader)(const DWORD *, size_t length),
HRESULT (WINAPI IDirect3DDevice9::*setShader)(D3DShaderType*));
bool setVertexShader(ShaderId shader);
......
......@@ -264,7 +264,7 @@ void Context::makeCurrent(egl::Display *display, egl::Surface *surface)
mVertexDataManager = new VertexDataManager(this, mDevice);
mIndexDataManager = new IndexDataManager(this, mDevice);
mBlit = new Blit(this);
mBlit = new Blit(mRenderer);
mSupportsShaderModel3 = mDeviceCaps.PixelShaderVersion >= D3DPS_VERSION(3, 0);
mMaximumPointSize = mDeviceCaps.MaxPointSize;
......
......@@ -64,7 +64,8 @@ unsigned int ProgramBinary::mCurrentSerial = 1;
ProgramBinary::ProgramBinary() : RefCountObject(0), mSerial(issueSerial())
{
mDevice = getDevice(); // D3D9_REPLACE
mRenderer = getDisplay()->getRenderer();
mDevice = mRenderer->getDevice(); // D3D9_REPLACE
mPixelExecutable = NULL;
mVertexExecutable = NULL;
......@@ -1746,7 +1747,7 @@ bool ProgramBinary::load(InfoLog &infoLog, const void *binary, GLsizei length)
ptr += sizeof(GUID);
// D3D9_REPLACE
D3DADAPTER_IDENTIFIER9 *currentIdentifier = getDisplay()->getRenderer()->getAdapterIdentifier();
D3DADAPTER_IDENTIFIER9 *currentIdentifier = mRenderer->getAdapterIdentifier();
if (memcmp(&currentIdentifier->DeviceIdentifier, binaryIdentifier, sizeof(GUID)) != 0)
{
infoLog.append("Invalid program binary.");
......@@ -1759,14 +1760,14 @@ bool ProgramBinary::load(InfoLog &infoLog, const void *binary, GLsizei length)
const char *vertexShaderFunction = ptr;
ptr += vertexShaderSize;
mPixelExecutable = getDisplay()->createPixelShader(reinterpret_cast<const DWORD*>(pixelShaderFunction), pixelShaderSize);
mPixelExecutable = mRenderer->createPixelShader(reinterpret_cast<const DWORD*>(pixelShaderFunction), pixelShaderSize);
if (!mPixelExecutable)
{
infoLog.append("Could not create pixel shader.");
return false;
}
mVertexExecutable = getDisplay()->createVertexShader(reinterpret_cast<const DWORD*>(vertexShaderFunction), vertexShaderSize);
mVertexExecutable = mRenderer->createVertexShader(reinterpret_cast<const DWORD*>(vertexShaderFunction), vertexShaderSize);
if (!mVertexExecutable)
{
infoLog.append("Could not create vertex shader.");
......@@ -1853,7 +1854,7 @@ bool ProgramBinary::save(void* binary, GLsizei bufSize, GLsizei *length)
stream.write(vertexShaderSize);
// D3D9_REPLACE
D3DADAPTER_IDENTIFIER9 *identifier = getDisplay()->getRenderer()->getAdapterIdentifier();
D3DADAPTER_IDENTIFIER9 *identifier = mRenderer->getAdapterIdentifier();
GLsizei streamLength = stream.length();
const void *streamData = stream.data();
......@@ -1940,13 +1941,13 @@ bool ProgramBinary::link(InfoLog &infoLog, const AttributeBindings &attributeBin
if (vertexBinary && pixelBinary)
{
mVertexExecutable = getDisplay()->createVertexShader((DWORD*)vertexBinary->GetBufferPointer(), vertexBinary->GetBufferSize());
mVertexExecutable = mRenderer->createVertexShader((DWORD*)vertexBinary->GetBufferPointer(), vertexBinary->GetBufferSize());
if (!mVertexExecutable)
{
return error(GL_OUT_OF_MEMORY, false);
}
mPixelExecutable = getDisplay()->createPixelShader((DWORD*)pixelBinary->GetBufferPointer(), pixelBinary->GetBufferSize());
mPixelExecutable = mRenderer->createPixelShader((DWORD*)pixelBinary->GetBufferPointer(), pixelBinary->GetBufferSize());
if (!mPixelExecutable)
{
mVertexExecutable->Release();
......
......@@ -184,10 +184,11 @@ class ProgramBinary : public RefCountObject
void applyUniformniv(Uniform *targetUniform, GLsizei count, const Vector4 *vector);
void applyUniformnbv(Uniform *targetUniform, GLsizei count, int width, const GLboolean *v);
IDirect3DDevice9 *mDevice;
renderer::Renderer *mRenderer;
IDirect3DDevice9 *mDevice; // D3D9_REPLACE
IDirect3DPixelShader9 *mPixelExecutable;
IDirect3DVertexShader9 *mVertexExecutable;
IDirect3DPixelShader9 *mPixelExecutable; // D3D9_REPLACE
IDirect3DVertexShader9 *mVertexExecutable; // D3D9_REPLACE
// These are only used during linking.
D3DConstantTable *mConstantTablePS;
......
......@@ -274,6 +274,7 @@ copy "$(OutDir)libGLESv2.lib" "$(ProjectDir)..\..\lib\$(Configuration)\"
<ClInclude Include="..\common\RefCountObject.h" />
<ClInclude Include="Renderbuffer.h" />
<ClInclude Include="renderer\Renderer.h" />
<ClInclude Include="renderer\ShaderCache.h" />
<ClInclude Include="resource.h" />
<ClInclude Include="ResourceManager.h" />
<ClInclude Include="Shader.h" />
......
......@@ -169,6 +169,9 @@
<ClInclude Include="renderer\Renderer.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="renderer\ShaderCache.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="libGLESv2.def">
......
......@@ -199,6 +199,9 @@ EGLint Renderer::initialize()
ASSERT(SUCCEEDED(result));
}
mVertexShaderCache.initialize(mDevice);
mPixelShaderCache.initialize(mDevice);
initializeDevice();
return EGL_SUCCESS;
......@@ -344,6 +347,16 @@ void Renderer::freeEventQuery(IDirect3DQuery9* query)
}
}
IDirect3DVertexShader9 *Renderer::createVertexShader(const DWORD *function, size_t length)
{
return mVertexShaderCache.create(function, length);
}
IDirect3DPixelShader9 *Renderer::createPixelShader(const DWORD *function, size_t length)
{
return mPixelShaderCache.create(function, length);
}
void Renderer::releaseDeviceResources()
{
while (!mEventQueryPool.empty())
......@@ -351,6 +364,9 @@ void Renderer::releaseDeviceResources()
mEventQueryPool.back()->Release();
mEventQueryPool.pop_back();
}
mVertexShaderCache.clear();
mPixelShaderCache.clear();
}
......
......@@ -13,7 +13,6 @@
#include <set>
#include <vector>
#include "common/angleutils.h"
#define GL_APICALL
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
......@@ -22,6 +21,9 @@
#include <d3d9.h> // D3D9_REPLACE
#include "common/angleutils.h"
#include "libGLESv2/renderer/ShaderCache.h"
const int versionWindowsVista = MAKEWORD(0x00, 0x06);
const int versionWindows7 = MAKEWORD(0x01, 0x06);
......@@ -59,10 +61,10 @@ class Renderer
virtual IDirect3DQuery9* allocateEventQuery();
virtual void freeEventQuery(IDirect3DQuery9* query);
#if 0
// resource creation
virtual void *createVertexShader(const DWORD *function, size_t length);
virtual void *createPixelShader(const DWORD *function, size_t length);
virtual IDirect3DVertexShader9 *createVertexShader(const DWORD *function, size_t length); // D3D9_REPLACE
virtual IDirect3DPixelShader9 *createPixelShader(const DWORD *function, size_t length); // D3D9_REPLACE
#if 0
virtual void *createTexture2D();
virtual void *createTextureCube();
virtual void *createQuery();;
......@@ -141,6 +143,8 @@ class Renderer
// A pool of event queries that are currently unused.
std::vector<IDirect3DQuery9*> mEventQueryPool;
VertexShaderCache mVertexShaderCache;
PixelShaderCache mPixelShaderCache;
};
}
......
......@@ -4,11 +4,11 @@
// found in the LICENSE file.
//
// Display.h: Defines egl::ShaderCache, a cache of Direct3D shader objects
// ShaderCache: Defines renderer::ShaderCache, a cache of Direct3D shader objects
// keyed by their byte code.
#ifndef LIBEGL_SHADER_CACHE_H_
#define LIBEGL_SHADER_CACHE_H_
#ifndef LIBGLESV2_RENDERER_SHADER_CACHE_H_
#define LIBGLESV2_RENDERER_SHADER_CACHE_H_
#include <d3d9.h>
......@@ -18,7 +18,9 @@
#include <unordered_map>
#endif
namespace egl
#include "common/debug.h"
namespace renderer
{
template <typename ShaderObject>
class ShaderCache
......@@ -48,7 +50,7 @@ class ShaderCache
it->second->AddRef();
return it->second;
}
ShaderObject *shader;
HRESULT result = createShader(function, &shader);
if (FAILED(result))
......@@ -113,4 +115,4 @@ typedef ShaderCache<IDirect3DPixelShader9> PixelShaderCache;
}
#endif // LIBEGL_SHADER_CACHE_H_
#endif // LIBGLESV2_RENDERER_SHADER_CACHE_H_
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