blob: 347829f2b5328ef8745f8ab8b2a393eb804c04ad [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>
daniel@transgaming.comb7833982012-10-31 18:31:46 +000014#include <map>
daniel@transgaming.comef21ab22012-10-31 17:52:47 +000015#include <vector>
16
daniel@transgaming.com621ce052012-10-31 17:52:29 +000017#define GL_APICALL
18#include <GLES2/gl2.h>
19#include <GLES2/gl2ext.h>
20#define EGLAPI
21#include <EGL/egl.h>
22
23#include <d3d9.h> // D3D9_REPLACE
24
daniel@transgaming.come4733d72012-10-31 18:07:01 +000025#include "common/angleutils.h"
26#include "libGLESv2/renderer/ShaderCache.h"
daniel@transgaming.comba0570e2012-10-31 18:07:39 +000027#include "libGLESv2/EnumTypes.h"
28#include "libGLESv2/Texture.h"
daniel@transgaming.come4733d72012-10-31 18:07:01 +000029
daniel@transgaming.com621ce052012-10-31 17:52:29 +000030const int versionWindowsVista = MAKEWORD(0x00, 0x06);
31const int versionWindows7 = MAKEWORD(0x01, 0x06);
32
33// Return the version of the operating system in a format suitable for ordering
34// comparison.
35inline int getComparableOSVersion()
36{
37 DWORD version = GetVersion();
38 int majorVersion = LOBYTE(LOWORD(version));
39 int minorVersion = HIBYTE(LOWORD(version));
40 return MAKEWORD(minorVersion, majorVersion);
41}
42
daniel@transgaming.comef21ab22012-10-31 17:52:47 +000043namespace egl
44{
45class Display;
46}
47
daniel@transgaming.com621ce052012-10-31 17:52:29 +000048namespace renderer
49{
50
daniel@transgaming.com3281f972012-10-31 18:38:51 +000051struct ConfigDesc
52{
53 GLenum renderTargetFormat;
54 GLenum depthStencilFormat;
55 GLint multiSample;
56 bool fastConfig;
57};
58
daniel@transgaming.com621ce052012-10-31 17:52:29 +000059class Renderer
60{
61 public:
daniel@transgaming.comef21ab22012-10-31 17:52:47 +000062 Renderer(egl::Display *display, HMODULE hModule, HDC hDc);
daniel@transgaming.com621ce052012-10-31 17:52:29 +000063 virtual ~Renderer();
64
65 virtual EGLint initialize();
66 virtual bool resetDevice();
67
daniel@transgaming.com3281f972012-10-31 18:38:51 +000068 virtual int generateConfigs(ConfigDesc **configDescList);
69 virtual void deleteConfigs(ConfigDesc *configDescList);
70
daniel@transgaming.com621ce052012-10-31 17:52:29 +000071 virtual void startScene();
72 virtual void endScene();
73
daniel@transgaming.comef21ab22012-10-31 17:52:47 +000074 virtual void sync(bool block);
75 virtual IDirect3DQuery9* allocateEventQuery();
76 virtual void freeEventQuery(IDirect3DQuery9* query);
77
daniel@transgaming.com621ce052012-10-31 17:52:29 +000078 // resource creation
daniel@transgaming.come4733d72012-10-31 18:07:01 +000079 virtual IDirect3DVertexShader9 *createVertexShader(const DWORD *function, size_t length); // D3D9_REPLACE
80 virtual IDirect3DPixelShader9 *createPixelShader(const DWORD *function, size_t length); // D3D9_REPLACE
81#if 0
daniel@transgaming.com621ce052012-10-31 17:52:29 +000082 virtual void *createTexture2D();
83 virtual void *createTextureCube();
84 virtual void *createQuery();;
85 virtual void *createIndexBuffer();
86 virtual void *createVertexbuffer();
87
88 // state setup
daniel@transgaming.com621ce052012-10-31 17:52:29 +000089 virtual void applyShaders();
90 virtual void applyConstants();
91 virtual void applyRenderTargets();
92 virtual void applyState();
93#endif
daniel@transgaming.comba0570e2012-10-31 18:07:39 +000094 virtual void setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &sampler);
daniel@transgaming.coma734f272012-10-31 18:07:48 +000095 virtual void setTexture(gl::SamplerType type, int index, gl::Texture *texture);
daniel@transgaming.com621ce052012-10-31 17:52:29 +000096
97 // lost device
98 virtual void markDeviceLost();
99 virtual bool isDeviceLost();
daniel@transgaming.comf688c0d2012-10-31 17:52:57 +0000100 virtual bool testDeviceLost(bool notify);
daniel@transgaming.com621ce052012-10-31 17:52:29 +0000101 virtual bool testDeviceResettable();
102
103 // Renderer capabilities
104 virtual IDirect3DDevice9 *getDevice() {return mDevice;}; // D3D9_REPLACE
105 virtual D3DADAPTER_IDENTIFIER9 *getAdapterIdentifier() {return &mAdapterIdentifier;}; // D3D9_REPLACE
daniel@transgaming.com621ce052012-10-31 17:52:29 +0000106 virtual bool isD3d9ExDevice() const { return mD3d9Ex != NULL; } // D3D9_REMOVE
107
daniel@transgaming.com621ce052012-10-31 17:52:29 +0000108 virtual bool getDXT1TextureSupport();
109 virtual bool getDXT3TextureSupport();
110 virtual bool getDXT5TextureSupport();
111 virtual bool getEventQuerySupport();
112 virtual bool getFloat32TextureSupport(bool *filtering, bool *renderable);
113 virtual bool getFloat16TextureSupport(bool *filtering, bool *renderable);
114 virtual bool getLuminanceTextureSupport();
115 virtual bool getLuminanceAlphaTextureSupport();
116 virtual bool getVertexTextureSupport() const;
117 virtual bool getNonPower2TextureSupport() const;
118 virtual bool getDepthTextureSupport() const;
119 virtual bool getOcclusionQuerySupport() const;
120 virtual bool getInstancingSupport() const;
daniel@transgaming.comba0570e2012-10-31 18:07:39 +0000121 virtual bool getTextureFilterAnisotropySupport() const;
122 virtual float getTextureMaxAnisotropy() const;
daniel@transgaming.com313e3922012-10-31 17:52:39 +0000123 virtual bool getShareHandleSupport() const;
daniel@transgaming.com621ce052012-10-31 17:52:29 +0000124
daniel@transgaming.com5f4c1362012-10-31 18:29:00 +0000125 virtual bool getShaderModel3Support() const;
126 virtual float getMaxPointSize() const;
127 virtual int getMaxTextureWidth() const;
128 virtual int getMaxTextureHeight() const;
129 virtual bool get32BitIndexSupport() const;
130 virtual DWORD getCapsDeclTypes() const; // D3D9_REPLACE
131 virtual int getMinSwapInterval() const;
132 virtual int getMaxSwapInterval() const;
133
daniel@transgaming.comb7833982012-10-31 18:31:46 +0000134 virtual GLsizei getMaxSupportedSamples() const;
135 virtual int getNearestSupportedSamples(D3DFORMAT format, int requested) const;
136
daniel@transgaming.com621ce052012-10-31 17:52:29 +0000137 virtual D3DPOOL getBufferPool(DWORD usage) const;
138 virtual D3DPOOL getTexturePool(DWORD usage) const;
139
140 private:
141 DISALLOW_COPY_AND_ASSIGN(Renderer);
142
daniel@transgaming.comb7833982012-10-31 18:31:46 +0000143 void getMultiSampleSupport(D3DFORMAT format, bool *multiSampleArray); // D3D9_REPLACE
144
daniel@transgaming.com92955622012-10-31 18:38:41 +0000145 static const D3DFORMAT mRenderTargetFormats[];
146 static const D3DFORMAT mDepthStencilFormats[];
147
daniel@transgaming.comef21ab22012-10-31 17:52:47 +0000148 egl::Display *mDisplay;
daniel@transgaming.com621ce052012-10-31 17:52:29 +0000149 const HDC mDc;
150 HMODULE mD3d9Module;
151
152 void initializeDevice();
153 D3DPRESENT_PARAMETERS getDefaultPresentParameters();
daniel@transgaming.comef21ab22012-10-31 17:52:47 +0000154 void releaseDeviceResources();
daniel@transgaming.com621ce052012-10-31 17:52:29 +0000155
156 UINT mAdapter;
157 D3DDEVTYPE mDeviceType;
158 IDirect3D9 *mD3d9; // Always valid after successful initialization.
159 IDirect3D9Ex *mD3d9Ex; // Might be null if D3D9Ex is not supported.
160 IDirect3DDevice9 *mDevice;
161 IDirect3DDevice9Ex *mDeviceEx; // Might be null if D3D9Ex is not supported.
162
163 HWND mDeviceWindow;
164
165 bool mDeviceLost;
166 D3DCAPS9 mDeviceCaps;
167 D3DADAPTER_IDENTIFIER9 mAdapterIdentifier;
168
169 bool mSceneStarted;
170 bool mSupportsNonPower2Textures;
daniel@transgaming.comba0570e2012-10-31 18:07:39 +0000171 bool mSupportsTextureFilterAnisotropy;
daniel@transgaming.com5f4c1362012-10-31 18:29:00 +0000172 int mMinSwapInterval;
173 int mMaxSwapInterval;
daniel@transgaming.comef21ab22012-10-31 17:52:47 +0000174
daniel@transgaming.comb7833982012-10-31 18:31:46 +0000175 std::map<D3DFORMAT, bool *> mMultiSampleSupport;
176 GLsizei mMaxSupportedSamples;
177
daniel@transgaming.comef21ab22012-10-31 17:52:47 +0000178 // A pool of event queries that are currently unused.
179 std::vector<IDirect3DQuery9*> mEventQueryPool;
daniel@transgaming.come4733d72012-10-31 18:07:01 +0000180 VertexShaderCache mVertexShaderCache;
181 PixelShaderCache mPixelShaderCache;
daniel@transgaming.com621ce052012-10-31 17:52:29 +0000182};
183
184}
185#endif // LIBGLESV2_RENDERER_RENDERER_H_