blob: dc08fa9e113fc920d96376c9ada866a925a2df36 [file] [log] [blame]
daniel@transgaming.com621ce052012-10-31 17:52:29 +00001//
2// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Renderer.h: Defines a back-end specific class that hides the details of the
8// implementation-specific renderer.
9
10#ifndef LIBGLESV2_RENDERER_RENDERER_H_
11#define LIBGLESV2_RENDERER_RENDERER_H_
12
daniel@transgaming.comef21ab22012-10-31 17:52:47 +000013#include <set>
14#include <vector>
15
daniel@transgaming.com621ce052012-10-31 17:52:29 +000016#define GL_APICALL
17#include <GLES2/gl2.h>
18#include <GLES2/gl2ext.h>
19#define EGLAPI
20#include <EGL/egl.h>
21
22#include <d3d9.h> // D3D9_REPLACE
23
daniel@transgaming.come4733d72012-10-31 18:07:01 +000024#include "common/angleutils.h"
25#include "libGLESv2/renderer/ShaderCache.h"
daniel@transgaming.comba0570e2012-10-31 18:07:39 +000026#include "libGLESv2/EnumTypes.h"
27#include "libGLESv2/Texture.h"
daniel@transgaming.come4733d72012-10-31 18:07:01 +000028
daniel@transgaming.com621ce052012-10-31 17:52:29 +000029const int versionWindowsVista = MAKEWORD(0x00, 0x06);
30const int versionWindows7 = MAKEWORD(0x01, 0x06);
31
32// Return the version of the operating system in a format suitable for ordering
33// comparison.
34inline int getComparableOSVersion()
35{
36 DWORD version = GetVersion();
37 int majorVersion = LOBYTE(LOWORD(version));
38 int minorVersion = HIBYTE(LOWORD(version));
39 return MAKEWORD(minorVersion, majorVersion);
40}
41
daniel@transgaming.comef21ab22012-10-31 17:52:47 +000042namespace egl
43{
44class Display;
45}
46
daniel@transgaming.com621ce052012-10-31 17:52:29 +000047namespace renderer
48{
49
50class Renderer
51{
52 public:
daniel@transgaming.comef21ab22012-10-31 17:52:47 +000053 Renderer(egl::Display *display, HMODULE hModule, HDC hDc);
daniel@transgaming.com621ce052012-10-31 17:52:29 +000054 virtual ~Renderer();
55
56 virtual EGLint initialize();
57 virtual bool resetDevice();
58
59 virtual void startScene();
60 virtual void endScene();
61
daniel@transgaming.comef21ab22012-10-31 17:52:47 +000062 virtual void sync(bool block);
63 virtual IDirect3DQuery9* allocateEventQuery();
64 virtual void freeEventQuery(IDirect3DQuery9* query);
65
daniel@transgaming.com621ce052012-10-31 17:52:29 +000066 // resource creation
daniel@transgaming.come4733d72012-10-31 18:07:01 +000067 virtual IDirect3DVertexShader9 *createVertexShader(const DWORD *function, size_t length); // D3D9_REPLACE
68 virtual IDirect3DPixelShader9 *createPixelShader(const DWORD *function, size_t length); // D3D9_REPLACE
69#if 0
daniel@transgaming.com621ce052012-10-31 17:52:29 +000070 virtual void *createTexture2D();
71 virtual void *createTextureCube();
72 virtual void *createQuery();;
73 virtual void *createIndexBuffer();
74 virtual void *createVertexbuffer();
75
76 // state setup
daniel@transgaming.com621ce052012-10-31 17:52:29 +000077 virtual void applyShaders();
78 virtual void applyConstants();
79 virtual void applyRenderTargets();
80 virtual void applyState();
81#endif
daniel@transgaming.comba0570e2012-10-31 18:07:39 +000082 virtual void setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &sampler);
daniel@transgaming.coma734f272012-10-31 18:07:48 +000083 virtual void setTexture(gl::SamplerType type, int index, gl::Texture *texture);
daniel@transgaming.com621ce052012-10-31 17:52:29 +000084
85 // lost device
86 virtual void markDeviceLost();
87 virtual bool isDeviceLost();
daniel@transgaming.comf688c0d2012-10-31 17:52:57 +000088 virtual bool testDeviceLost(bool notify);
daniel@transgaming.com621ce052012-10-31 17:52:29 +000089 virtual bool testDeviceResettable();
90
91 // Renderer capabilities
92 virtual IDirect3DDevice9 *getDevice() {return mDevice;}; // D3D9_REPLACE
93 virtual D3DADAPTER_IDENTIFIER9 *getAdapterIdentifier() {return &mAdapterIdentifier;}; // D3D9_REPLACE
daniel@transgaming.com621ce052012-10-31 17:52:29 +000094 virtual IDirect3D9 *getD3D() {return mD3d9;}; // D3D9_REMOVE
95 virtual UINT getAdapter() {return mAdapter;}; // D3D9_REMOVE
96 virtual D3DDEVTYPE getDeviceType() {return mDeviceType;}; // D3D9_REMOVE
97 virtual bool isD3d9ExDevice() const { return mD3d9Ex != NULL; } // D3D9_REMOVE
98
99 virtual void getMultiSampleSupport(D3DFORMAT format, bool *multiSampleArray); // D3D9_REPLACE
100 virtual bool getDXT1TextureSupport();
101 virtual bool getDXT3TextureSupport();
102 virtual bool getDXT5TextureSupport();
103 virtual bool getEventQuerySupport();
104 virtual bool getFloat32TextureSupport(bool *filtering, bool *renderable);
105 virtual bool getFloat16TextureSupport(bool *filtering, bool *renderable);
106 virtual bool getLuminanceTextureSupport();
107 virtual bool getLuminanceAlphaTextureSupport();
108 virtual bool getVertexTextureSupport() const;
109 virtual bool getNonPower2TextureSupport() const;
110 virtual bool getDepthTextureSupport() const;
111 virtual bool getOcclusionQuerySupport() const;
112 virtual bool getInstancingSupport() const;
daniel@transgaming.comba0570e2012-10-31 18:07:39 +0000113 virtual bool getTextureFilterAnisotropySupport() const;
114 virtual float getTextureMaxAnisotropy() const;
daniel@transgaming.com313e3922012-10-31 17:52:39 +0000115 virtual bool getShareHandleSupport() const;
daniel@transgaming.com621ce052012-10-31 17:52:29 +0000116
daniel@transgaming.com5f4c1362012-10-31 18:29:00 +0000117 virtual bool getShaderModel3Support() const;
118 virtual float getMaxPointSize() const;
119 virtual int getMaxTextureWidth() const;
120 virtual int getMaxTextureHeight() const;
121 virtual bool get32BitIndexSupport() const;
122 virtual DWORD getCapsDeclTypes() const; // D3D9_REPLACE
123 virtual int getMinSwapInterval() const;
124 virtual int getMaxSwapInterval() const;
125
daniel@transgaming.com621ce052012-10-31 17:52:29 +0000126 virtual D3DPOOL getBufferPool(DWORD usage) const;
127 virtual D3DPOOL getTexturePool(DWORD usage) const;
128
129 private:
130 DISALLOW_COPY_AND_ASSIGN(Renderer);
131
daniel@transgaming.comef21ab22012-10-31 17:52:47 +0000132 egl::Display *mDisplay;
daniel@transgaming.com621ce052012-10-31 17:52:29 +0000133 const HDC mDc;
134 HMODULE mD3d9Module;
135
136 void initializeDevice();
137 D3DPRESENT_PARAMETERS getDefaultPresentParameters();
daniel@transgaming.comef21ab22012-10-31 17:52:47 +0000138 void releaseDeviceResources();
daniel@transgaming.com621ce052012-10-31 17:52:29 +0000139
140 UINT mAdapter;
141 D3DDEVTYPE mDeviceType;
142 IDirect3D9 *mD3d9; // Always valid after successful initialization.
143 IDirect3D9Ex *mD3d9Ex; // Might be null if D3D9Ex is not supported.
144 IDirect3DDevice9 *mDevice;
145 IDirect3DDevice9Ex *mDeviceEx; // Might be null if D3D9Ex is not supported.
146
147 HWND mDeviceWindow;
148
149 bool mDeviceLost;
150 D3DCAPS9 mDeviceCaps;
151 D3DADAPTER_IDENTIFIER9 mAdapterIdentifier;
152
153 bool mSceneStarted;
154 bool mSupportsNonPower2Textures;
daniel@transgaming.comba0570e2012-10-31 18:07:39 +0000155 bool mSupportsTextureFilterAnisotropy;
daniel@transgaming.com5f4c1362012-10-31 18:29:00 +0000156 int mMinSwapInterval;
157 int mMaxSwapInterval;
daniel@transgaming.comef21ab22012-10-31 17:52:47 +0000158
159 // A pool of event queries that are currently unused.
160 std::vector<IDirect3DQuery9*> mEventQueryPool;
daniel@transgaming.come4733d72012-10-31 18:07:01 +0000161 VertexShaderCache mVertexShaderCache;
162 PixelShaderCache mPixelShaderCache;
daniel@transgaming.com621ce052012-10-31 17:52:29 +0000163};
164
165}
166#endif // LIBGLESV2_RENDERER_RENDERER_H_