12507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com//
2eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
32507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be
42507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com// found in the LICENSE file.
52507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com//
62507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
71d6aff2bc3bdd2c58e051f61cbeb491c30ec852fdaniel@transgaming.com// Renderer9.h: Defines a back-end specific class for the D3D9 renderer.
82507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
92507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com#ifndef LIBGLESV2_RENDERER_RENDERER9_H_
102507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com#define LIBGLESV2_RENDERER_RENDERER9_H_
112507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
122507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com#include "common/angleutils.h"
13a2ecfcccf1d1a85e6054a7314ce1f9de0648ac7fshannonwoods@chromium.org#include "common/mathutil.h"
14dad5ed3953e4f31c35b9fd67901fb78dbe140dd0Geoff Lang#include "libGLESv2/renderer/d3d/HLSLCompiler.h"
15c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d9/ShaderCache.h"
16c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d9/VertexDeclarationCache.h"
172507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com#include "libGLESv2/renderer/Renderer.h"
18d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.com#include "libGLESv2/renderer/RenderTarget.h"
1967094ee41f584b02e81dba8b2dd4c29463a67880daniel@transgaming.com
20486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.comnamespace gl
21486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com{
223c7fa226aeb81469b93142b54e339f13a46ab835Jamie Madillclass FramebufferAttachment;
23486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com}
24486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com
25312404870905e1eff46e21632c1c2f2143af4694daniel@transgaming.comnamespace rx
2667094ee41f584b02e81dba8b2dd4c29463a67880daniel@transgaming.com{
2767094ee41f584b02e81dba8b2dd4c29463a67880daniel@transgaming.comclass VertexDataManager;
28486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.comclass IndexDataManager;
2950cc725131415c0448592104ae2ad5f2079ebc1bdaniel@transgaming.comclass StreamingIndexBufferInterface;
3023ba30e4b0028998ca2a53f0553e2002bf755d74Geoff Langclass StaticIndexBufferInterface;
3191207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.comstruct TranslatedAttribute;
32dce735c3ee9d17f1b8f1174a82ce7bac61b78c50Geoff Langclass Blit9;
332507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
342507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.comclass Renderer9 : public Renderer
352507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com{
362507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com  public:
37591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang    Renderer9(egl::Display *display, EGLNativeDisplayType hDc, EGLint requestedDisplay);
382507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    virtual ~Renderer9();
392507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
40b64ed2824bfd5d67acb415300427edc40ae79253daniel@transgaming.com    static Renderer9 *makeRenderer9(Renderer *renderer);
41b64ed2824bfd5d67acb415300427edc40ae79253daniel@transgaming.com
422507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    virtual EGLint initialize();
432507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    virtual bool resetDevice();
442507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
452507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    virtual int generateConfigs(ConfigDesc **configDescList);
462507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    virtual void deleteConfigs(ConfigDesc *configDescList);
472507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
4891207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com    void startScene();
4991207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com    void endScene();
502507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
512507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    virtual void sync(bool block);
52b9bb27938fae86822453d7cba1bba6c704000a8adaniel@transgaming.com
53b9bb27938fae86822453d7cba1bba6c704000a8adaniel@transgaming.com    virtual SwapChain *createSwapChain(HWND window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat);
54b9bb27938fae86822453d7cba1bba6c704000a8adaniel@transgaming.com
552507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    IDirect3DQuery9* allocateEventQuery();
562507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    void freeEventQuery(IDirect3DQuery9* query);
572507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
582507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    // resource creation
59113f0eb7172eb8d3a31a8224d555db10458bde08daniel@transgaming.com    IDirect3DVertexShader9 *createVertexShader(const DWORD *function, size_t length);
60113f0eb7172eb8d3a31a8224d555db10458bde08daniel@transgaming.com    IDirect3DPixelShader9 *createPixelShader(const DWORD *function, size_t length);
61113f0eb7172eb8d3a31a8224d555db10458bde08daniel@transgaming.com    HRESULT createVertexBuffer(UINT Length, DWORD Usage, IDirect3DVertexBuffer9 **ppVertexBuffer);
62113f0eb7172eb8d3a31a8224d555db10458bde08daniel@transgaming.com    HRESULT createIndexBuffer(UINT Length, DWORD Usage, D3DFORMAT Format, IDirect3DIndexBuffer9 **ppIndexBuffer);
63e2e0ce0cd1b4b1845c5df4fc87d75b36ef6a8d6cGeoff Lang    virtual void generateSwizzle(gl::Texture *texture);
642507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    virtual void setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &sampler);
652507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    virtual void setTexture(gl::SamplerType type, int index, gl::Texture *texture);
662507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
671bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org    virtual bool setUniformBuffers(const gl::Buffer *vertexUniformBuffers[], const gl::Buffer *fragmentUniformBuffers[]);
681bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org
69237bc7e55bb631ebd1f5e7981b30b8a2eafbb606daniel@transgaming.com    virtual void setRasterizerState(const gl::RasterizerState &rasterState);
70c142e9da6a66c447bc0e519505fe9cf6adcc6ee6Geoff Lang    virtual void setBlendState(gl::Framebuffer *framebuffer, const gl::BlendState &blendState, const gl::ColorF &blendColor,
71493d4f872b528410dee998b38c89a31492a23895daniel@transgaming.com                               unsigned int sampleMask);
7208c331d42f31f8291238695d86db53d760e0b330daniel@transgaming.com    virtual void setDepthStencilState(const gl::DepthStencilState &depthStencilState, int stencilRef,
733a0ef48010e6a3e95c9d72f982ab6d3d4cad0c6fdaniel@transgaming.com                                      int stencilBackRef, bool frontFaceCCW);
74493d4f872b528410dee998b38c89a31492a23895daniel@transgaming.com
75d55e8c1b48f16f93cb89798fc3640047eb74d3fddaniel@transgaming.com    virtual void setScissorRectangle(const gl::Rectangle &scissor, bool enabled);
7602f18b883992598ffc22c2747720f17da65a330eGeoff Lang    virtual void setViewport(const gl::Rectangle &viewport, float zNear, float zFar, GLenum drawMode, GLenum frontFace,
770b236e2ec3c32b79d1abca881a32cbf53027e3d3shannon.woods@transgaming.com                             bool ignoreViewport);
78493d4f872b528410dee998b38c89a31492a23895daniel@transgaming.com
79ae39ee280d5e15b8064402b75e8daecbe4146b98daniel@transgaming.com    virtual bool applyRenderTarget(gl::Framebuffer *frameBuffer);
8004fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang    virtual void applyShaders(gl::ProgramBinary *programBinary, const gl::VertexFormat inputLayout[], const gl::Framebuffer *framebuffer,
8104fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang                              bool rasterizerDiscard, bool transformFeedbackActive);
828ff21aeaabebd0877c1cc48fdac718509f23617aJamie Madill    virtual void applyUniforms(const gl::ProgramBinary &programBinary);
8391207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com    virtual bool applyPrimitiveType(GLenum primitiveType, GLsizei elementCount);
84f7100b981f0856b238252e6052509eecf8e5adedGeoff Lang    virtual gl::Error applyVertexBuffer(gl::ProgramBinary *programBinary, const gl::VertexAttribute vertexAttributes[], const gl::VertexAttribCurrentValueData currentValues[],
85f7100b981f0856b238252e6052509eecf8e5adedGeoff Lang                                        GLint first, GLsizei count, GLsizei instances);
86c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang    virtual gl::Error applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo);
87493d4f872b528410dee998b38c89a31492a23895daniel@transgaming.com
88eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang    virtual void applyTransformFeedbackBuffers(gl::Buffer *transformFeedbackBuffers[], GLintptr offsets[]);
89eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang
904c5c6bbb82f96de2d3abe0c7c7c7d72fba5217c9Geoff Lang    virtual void drawArrays(GLenum mode, GLsizei count, GLsizei instances, bool transformFeedbackActive);
914c5c6bbb82f96de2d3abe0c7c7c7d72fba5217c9Geoff Lang    virtual void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices,
924c5c6bbb82f96de2d3abe0c7c7c7d72fba5217c9Geoff Lang                              gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo, GLsizei instances);
9367094ee41f584b02e81dba8b2dd4c29463a67880daniel@transgaming.com
94cc79b8c6b3c713904fa6d0613018b3e2f7fd8eacGeoff Lang    virtual gl::Error clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer);
95d084c620c0d275be03b10e1f802582dd278ff6fedaniel@transgaming.com
96c43a60557d5e25cfb80cb0cd3c2a01920251745fdaniel@transgaming.com    virtual void markAllStateDirty();
97c43a60557d5e25cfb80cb0cd3c2a01920251745fdaniel@transgaming.com
982507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    // lost device
99eb049e2c2de52176f2a755460d421889fda9ed19shannon.woods@transgaming.com    void notifyDeviceLost();
1002507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    virtual bool isDeviceLost();
1012507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    virtual bool testDeviceLost(bool notify);
1022507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    virtual bool testDeviceResettable();
1032507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
1041d6aff2bc3bdd2c58e051f61cbeb491c30ec852fdaniel@transgaming.com    IDirect3DDevice9 *getDevice() { return mDevice; }
1052507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    virtual DWORD getAdapterVendor() const;
106ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com    virtual std::string getRendererDescription() const;
1072507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    virtual GUID getAdapterIdentifier() const;
1082507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
109d8136cbbc2a2d9249ef1acad54fb875fe521eee5shannon.woods@transgaming.com    virtual unsigned int getReservedVertexUniformVectors() const;
110d8136cbbc2a2d9249ef1acad54fb875fe521eee5shannon.woods@transgaming.com    virtual unsigned int getReservedFragmentUniformVectors() const;
1112b5442236b5acaa150e1a608fa7c97c5e1b2e19eshannonwoods@chromium.org    virtual unsigned int getReservedVertexUniformBuffers() const;
1122b5442236b5acaa150e1a608fa7c97c5e1b2e19eshannonwoods@chromium.org    virtual unsigned int getReservedFragmentUniformBuffers() const;
1132507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    virtual bool getShareHandleSupport() const;
1148d2f086ad33f82aa1a01fe86a1bbfa6eba47e224shannon.woods@transgaming.com    virtual bool getPostSubBufferSupport() const;
1152507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
1169549bead5dc8bb07a21296ea8bea97939285c699daniel@transgaming.com    virtual int getMajorShaderModel() const;
117204677af271502bb1f91d4abd0cf8ab4ab5b49d0daniel@transgaming.com    DWORD getCapsDeclTypes() const;
1182507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    virtual int getMinSwapInterval() const;
1192507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    virtual int getMaxSwapInterval() const;
1202507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
121a9c7142435f100d43684a0efe8894cbe42ee8fccdaniel@transgaming.com    // Pixel operations
1222f06dbfb3f4bd815a3fe5b52638b091c1e356a04Jamie Madill    virtual bool copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source);
1232f06dbfb3f4bd815a3fe5b52638b091c1e356a04Jamie Madill    virtual bool copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source);
1242f06dbfb3f4bd815a3fe5b52638b091c1e356a04Jamie Madill    virtual bool copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source);
1252f06dbfb3f4bd815a3fe5b52638b091c1e356a04Jamie Madill    virtual bool copyToRenderTarget2DArray(TextureStorage *dest, TextureStorage *source);
126856d9d4b6c3ddf302a988037151a2d98334fa2ddJamie Madill
127856d9d4b6c3ddf302a988037151a2d98334fa2ddJamie Madill    virtual bool copyImage2D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
1282f06dbfb3f4bd815a3fe5b52638b091c1e356a04Jamie Madill                             GLint xoffset, GLint yoffset, TextureStorage *storage, GLint level);
129856d9d4b6c3ddf302a988037151a2d98334fa2ddJamie Madill    virtual bool copyImageCube(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
1302f06dbfb3f4bd815a3fe5b52638b091c1e356a04Jamie Madill                               GLint xoffset, GLint yoffset, TextureStorage *storage, GLenum target, GLint level);
131856d9d4b6c3ddf302a988037151a2d98334fa2ddJamie Madill    virtual bool copyImage3D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
1322f06dbfb3f4bd815a3fe5b52638b091c1e356a04Jamie Madill                             GLint xoffset, GLint yoffset, GLint zOffset, TextureStorage *storage, GLint level);
133856d9d4b6c3ddf302a988037151a2d98334fa2ddJamie Madill    virtual bool copyImage2DArray(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
1342f06dbfb3f4bd815a3fe5b52638b091c1e356a04Jamie Madill                                  GLint xoffset, GLint yoffset, GLint zOffset, TextureStorage *storage, GLint level);
135de8a7fff02ab478458e4f511719e15f141c90fe7daniel@transgaming.com
136ea4a0c6671ab0b079ed5e0313699742d1c6a9bd1shannon.woods@transgaming.com    virtual bool blitRect(gl::Framebuffer *readTarget, const gl::Rectangle &readRect, gl::Framebuffer *drawTarget, const gl::Rectangle &drawRect,
137125deab6241c659dab0c9bb9f55c08daecc2f534Geoff Lang                          const gl::Rectangle *scissor, bool blitRenderTarget, bool blitDepth, bool blitStencil, GLenum filter);
13863d2fc7f40d626342a0f9a82457b3fe0a81efca7Geoff Lang
13963d2fc7f40d626342a0f9a82457b3fe0a81efca7Geoff Lang    virtual gl::Error readPixels(gl::Framebuffer *framebuffer, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format,
14063d2fc7f40d626342a0f9a82457b3fe0a81efca7Geoff Lang                                 GLenum type, GLuint outputPitch, const gl::PixelPackState &pack, uint8_t *pixels);
1416c87217467896d150743db19e2ed664ceec56785daniel@transgaming.com
142a9c7142435f100d43684a0efe8894cbe42ee8fccdaniel@transgaming.com    // RenderTarget creation
143f2423659230818b46346496f5212fc3d1f0b537fdaniel@transgaming.com    virtual RenderTarget *createRenderTarget(SwapChain *swapChain, bool depth);
144a2d97f13f648c978e942ce55df7a940d9944ef2eGeoff Lang    virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples);
145f2423659230818b46346496f5212fc3d1f0b537fdaniel@transgaming.com
146f05cdee4ce4adc73e79adb1d01ba76e742b3f892Brandon Jones    // Shader creation
147f05cdee4ce4adc73e79adb1d01ba76e742b3f892Brandon Jones    virtual ShaderImpl *createShader(GLenum type);
148c9610c51e9c02ba67c735ff449a70164cda12a60Brandon Jones    virtual ProgramImpl *createProgram();
149f05cdee4ce4adc73e79adb1d01ba76e742b3f892Brandon Jones
150a9c7142435f100d43684a0efe8894cbe42ee8fccdaniel@transgaming.com    // Shader operations
151f05cdee4ce4adc73e79adb1d01ba76e742b3f892Brandon Jones    virtual void releaseShaderCompiler();
15248dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang    virtual ShaderExecutable *loadExecutable(const void *function, size_t length, rx::ShaderType type,
15348dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang                                             const std::vector<gl::LinkedVarying> &transformFeedbackVaryings,
15448dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang                                             bool separatedOutputBuffers);
15548dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang    virtual ShaderExecutable *compileToExecutable(gl::InfoLog &infoLog, const char *shaderHLSL, rx::ShaderType type,
15648dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang                                                  const std::vector<gl::LinkedVarying> &transformFeedbackVaryings,
15748dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang                                                  bool separatedOutputBuffers, D3DWorkaroundType workaround);
1588ff21aeaabebd0877c1cc48fdac718509f23617aJamie Madill    virtual UniformStorage *createUniformStorage(size_t storageSize);
159a9c7142435f100d43684a0efe8894cbe42ee8fccdaniel@transgaming.com
160244e1838a3d475c26e6bc1830aab5e87f8bf8c48daniel@transgaming.com    // Image operations
161244e1838a3d475c26e6bc1830aab5e87f8bf8c48daniel@transgaming.com    virtual Image *createImage();
162f721fdbdaa5c675e60115e8f0203956f848c1fc1daniel@transgaming.com    virtual void generateMipmap(Image *dest, Image *source);
163413d27110d15e3f218ab8b1db01d08cdc036edb6daniel@transgaming.com    virtual TextureStorage *createTextureStorage2D(SwapChain *swapChain);
164bf712d0a32847868913a3521b44912a5c29f08b8Nicolas Capens    virtual TextureStorage *createTextureStorage2D(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels);
165bf712d0a32847868913a3521b44912a5c29f08b8Nicolas Capens    virtual TextureStorage *createTextureStorageCube(GLenum internalformat, bool renderTarget, int size, int levels);
166bf712d0a32847868913a3521b44912a5c29f08b8Nicolas Capens    virtual TextureStorage *createTextureStorage3D(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth, int levels);
167bf712d0a32847868913a3521b44912a5c29f08b8Nicolas Capens    virtual TextureStorage *createTextureStorage2DArray(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth, int levels);
168244e1838a3d475c26e6bc1830aab5e87f8bf8c48daniel@transgaming.com
169f47bebc401c034519a805fcdb28e7e456776115cBrandon Jones    // Texture creation
1706053a52e8d529c1bc7d35a8f92430bf8d93938b2Brandon Jones    virtual TextureImpl *createTexture(GLenum target);
171f47bebc401c034519a805fcdb28e7e456776115cBrandon Jones
1723f255b48a70b8f720d5da7cf2046eb81ba6606c2daniel@transgaming.com    // Buffer creation
173d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    virtual BufferImpl *createBuffer();
1743f255b48a70b8f720d5da7cf2046eb81ba6606c2daniel@transgaming.com    virtual VertexBuffer *createVertexBuffer();
1750b6d7741f627082bc197034e43da47e975909238daniel@transgaming.com    virtual IndexBuffer *createIndexBuffer();
1763f255b48a70b8f720d5da7cf2046eb81ba6606c2daniel@transgaming.com
1775bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    // Vertex Array creation
1785bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones    virtual VertexArrayImpl *createVertexArray();
1795bf98290459ca4ccab2f5be62f5fba2337fe8b7aBrandon Jones
180cfe787e70c714a2163e67985de34d219aea7f2a7shannon.woods@transgaming.com    // Query and Fence creation
18150df6c5f8a63c7fba902e4888cf9d63830f96f1eshannon.woods@transgaming.com    virtual QueryImpl *createQuery(GLenum type);
182cfe787e70c714a2163e67985de34d219aea7f2a7shannon.woods@transgaming.com    virtual FenceImpl *createFence();
18350df6c5f8a63c7fba902e4888cf9d63830f96f1eshannon.woods@transgaming.com
184db8ae16b8bbf6999a4f07dc65b0918938d78394cKenneth Russell    // Transform Feedback creation
185db8ae16b8bbf6999a4f07dc65b0918938d78394cKenneth Russell    virtual TransformFeedbackImpl* createTransformFeedback();
186db8ae16b8bbf6999a4f07dc65b0918938d78394cKenneth Russell
187a21eea36fbb03d7d680ca7f472fcf96b1bbc1f63Jamie Madill    // Buffer-to-texture and Texture-to-buffer copies
188005df41f8900641ed1df60700c8e2eca659a33cbGeoff Lang    virtual bool supportsFastCopyBufferToTexture(GLenum internalFormat) const;
189a21eea36fbb03d7d680ca7f472fcf96b1bbc1f63Jamie Madill    virtual bool fastCopyBufferToTexture(const gl::PixelUnpackState &unpack, unsigned int offset, RenderTarget *destRenderTarget,
190a21eea36fbb03d7d680ca7f472fcf96b1bbc1f63Jamie Madill                                         GLenum destinationFormat, GLenum sourcePixelsType, const gl::Box &destArea);
191a21eea36fbb03d7d680ca7f472fcf96b1bbc1f63Jamie Madill
192a9c7142435f100d43684a0efe8894cbe42ee8fccdaniel@transgaming.com    // D3D9-renderer specific methods
193de8a7fff02ab478458e4f511719e15f141c90fe7daniel@transgaming.com    bool boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest);
194de8a7fff02ab478458e4f511719e15f141c90fe7daniel@transgaming.com
1952507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    D3DPOOL getTexturePool(DWORD usage) const;
1962507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
1976e4f2a6b70e12750a1e79c3dcee6c6dd5cfb67feshannonwoods@chromium.org    virtual bool getLUID(LUID *adapterLuid) const;
19895ffb8683f3bf1874f0b4c41491633098ee08ab7Jamie Madill    virtual rx::VertexConversionType getVertexConversionType(const gl::VertexFormat &vertexFormat) const;
19995ffb8683f3bf1874f0b4c41491633098ee08ab7Jamie Madill    virtual GLenum getVertexComponentType(const gl::VertexFormat &vertexFormat) const;
2006e4f2a6b70e12750a1e79c3dcee6c6dd5cfb67feshannonwoods@chromium.org
2012507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com  private:
2022507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    DISALLOW_COPY_AND_ASSIGN(Renderer9);
2032507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
204c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang    virtual void generateCaps(gl::Caps *outCaps, gl::TextureCapsMap *outTextureCaps, gl::Extensions *outExtensions) const;
205cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang
206cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang    void release();
207b7935e51b6f3d163c29137da9ad72ecb8dad59c8Jamie Madill
208834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    void applyUniformnfv(gl::LinkedUniform *targetUniform, const GLfloat *v);
209834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    void applyUniformniv(gl::LinkedUniform *targetUniform, const GLint *v);
210834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    void applyUniformnbv(gl::LinkedUniform *targetUniform, const GLint *v);
211b6e55102440fb32157ee2cbc2d35aa21d46454f7daniel@transgaming.com
21291207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com    void drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer);
213f8c2f5cbfd1b2b75501b6e8a5539f491f4f0a5c7Geoff Lang    void drawIndexedPoints(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer);
21491207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com
21523ba30e4b0028998ca2a53f0553e2002bf755d74Geoff Lang    StaticIndexBufferInterface *getCountingIB(size_t count);
21623ba30e4b0028998ca2a53f0553e2002bf755d74Geoff Lang
2171d80eeec4391c7b9606baf759b830cd4d69acd28daniel@transgaming.com    bool copyToRenderTarget(IDirect3DSurface9 *dest, IDirect3DSurface9 *source, bool fromManaged);
2183c7fa226aeb81469b93142b54e339f13a46ab835Jamie Madill    gl::FramebufferAttachment *getNullColorbuffer(gl::FramebufferAttachment *depthbuffer);
2192507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
220113f0eb7172eb8d3a31a8224d555db10458bde08daniel@transgaming.com    D3DPOOL getBufferPool(DWORD usage) const;
221113f0eb7172eb8d3a31a8224d555db10458bde08daniel@transgaming.com
2222507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    HMODULE mD3d9Module;
2232507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    HDC mDc;
2242507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
2252507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    void initializeDevice();
2262507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    D3DPRESENT_PARAMETERS getDefaultPresentParameters();
2272507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    void releaseDeviceResources();
2282507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
229b7935e51b6f3d163c29137da9ad72ecb8dad59c8Jamie Madill    HRESULT getDeviceStatusCode();
23088f779dd08d4fb0593cc2ec9bfd908e90146c16eJamie Madill    bool isRemovedDeviceResettable() const;
23188f779dd08d4fb0593cc2ec9bfd908e90146c16eJamie Madill    bool resetRemovedDevice();
232b7935e51b6f3d163c29137da9ad72ecb8dad59c8Jamie Madill
2332507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    UINT mAdapter;
2342507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    D3DDEVTYPE mDeviceType;
2352507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    IDirect3D9 *mD3d9;  // Always valid after successful initialization.
2362507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    IDirect3D9Ex *mD3d9Ex;  // Might be null if D3D9Ex is not supported.
2372507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    IDirect3DDevice9 *mDevice;
2382507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    IDirect3DDevice9Ex *mDeviceEx;  // Might be null if D3D9Ex is not supported.
2392507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
240dad5ed3953e4f31c35b9fd67901fb78dbe140dd0Geoff Lang    HLSLCompiler mCompiler;
241dad5ed3953e4f31c35b9fd67901fb78dbe140dd0Geoff Lang
242dce735c3ee9d17f1b8f1174a82ce7bac61b78c50Geoff Lang    Blit9 *mBlit;
243de8a7fff02ab478458e4f511719e15f141c90fe7daniel@transgaming.com
2442507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    HWND mDeviceWindow;
2452507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
2462507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    bool mDeviceLost;
2472507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    D3DCAPS9 mDeviceCaps;
2482507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    D3DADAPTER_IDENTIFIER9 mAdapterIdentifier;
2492507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
25091207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com    D3DPRIMITIVETYPE mPrimitiveType;
25191207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com    int mPrimitiveCount;
25291207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com    GLsizei mRepeatDraw;
25391207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com
2542507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    bool mSceneStarted;
2552507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    int mMinSwapInterval;
2562507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    int mMaxSwapInterval;
2572507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
258669c99595066ec7476be84a4efc9895d49515fecdaniel@transgaming.com    bool mVertexTextureSupport;
259669c99595066ec7476be84a4efc9895d49515fecdaniel@transgaming.com
260220e79a62ebbafd52e64ced02bc965c3f5ad5f4bdaniel@transgaming.com    // current render target states
261220e79a62ebbafd52e64ced02bc965c3f5ad5f4bdaniel@transgaming.com    unsigned int mAppliedRenderTargetSerial;
262220e79a62ebbafd52e64ced02bc965c3f5ad5f4bdaniel@transgaming.com    unsigned int mAppliedDepthbufferSerial;
263220e79a62ebbafd52e64ced02bc965c3f5ad5f4bdaniel@transgaming.com    unsigned int mAppliedStencilbufferSerial;
264220e79a62ebbafd52e64ced02bc965c3f5ad5f4bdaniel@transgaming.com    bool mDepthStencilInitialized;
265220e79a62ebbafd52e64ced02bc965c3f5ad5f4bdaniel@transgaming.com    bool mRenderTargetDescInitialized;
266220e79a62ebbafd52e64ced02bc965c3f5ad5f4bdaniel@transgaming.com    rx::RenderTarget::Desc mRenderTargetDesc;
2673a0ef48010e6a3e95c9d72f982ab6d3d4cad0c6fdaniel@transgaming.com    unsigned int mCurStencilSize;
268237bc7e55bb631ebd1f5e7981b30b8a2eafbb606daniel@transgaming.com    unsigned int mCurDepthSize;
269220e79a62ebbafd52e64ced02bc965c3f5ad5f4bdaniel@transgaming.com
2700393e5b5ba8a142cea876743b848de129b17a11bdaniel@transgaming.com    IDirect3DStateBlock9 *mMaskedClearSavedState;
2710393e5b5ba8a142cea876743b848de129b17a11bdaniel@transgaming.com
272493d4f872b528410dee998b38c89a31492a23895daniel@transgaming.com    // previously set render states
273493d4f872b528410dee998b38c89a31492a23895daniel@transgaming.com    bool mForceSetDepthStencilState;
274493d4f872b528410dee998b38c89a31492a23895daniel@transgaming.com    gl::DepthStencilState mCurDepthStencilState;
27508c331d42f31f8291238695d86db53d760e0b330daniel@transgaming.com    int mCurStencilRef;
27608c331d42f31f8291238695d86db53d760e0b330daniel@transgaming.com    int mCurStencilBackRef;
277493d4f872b528410dee998b38c89a31492a23895daniel@transgaming.com    bool mCurFrontFaceCCW;
278493d4f872b528410dee998b38c89a31492a23895daniel@transgaming.com
279493d4f872b528410dee998b38c89a31492a23895daniel@transgaming.com    bool mForceSetRasterState;
280493d4f872b528410dee998b38c89a31492a23895daniel@transgaming.com    gl::RasterizerState mCurRasterState;
281493d4f872b528410dee998b38c89a31492a23895daniel@transgaming.com
282493d4f872b528410dee998b38c89a31492a23895daniel@transgaming.com    bool mForceSetScissor;
283493d4f872b528410dee998b38c89a31492a23895daniel@transgaming.com    gl::Rectangle mCurScissor;
284d55e8c1b48f16f93cb89798fc3640047eb74d3fddaniel@transgaming.com    bool mScissorEnabled;
285493d4f872b528410dee998b38c89a31492a23895daniel@transgaming.com
28683e80ee442d5f793b89aaef7d1b5db3cde2f4b4ddaniel@transgaming.com    bool mForceSetViewport;
28783e80ee442d5f793b89aaef7d1b5db3cde2f4b4ddaniel@transgaming.com    gl::Rectangle mCurViewport;
28883e80ee442d5f793b89aaef7d1b5db3cde2f4b4ddaniel@transgaming.com    float mCurNear;
28983e80ee442d5f793b89aaef7d1b5db3cde2f4b4ddaniel@transgaming.com    float mCurFar;
290de14d6070d51532380cc954ec3627d20c769fcb6Geoff Lang    float mCurDepthFront;
29183e80ee442d5f793b89aaef7d1b5db3cde2f4b4ddaniel@transgaming.com
292493d4f872b528410dee998b38c89a31492a23895daniel@transgaming.com    bool mForceSetBlendState;
293493d4f872b528410dee998b38c89a31492a23895daniel@transgaming.com    gl::BlendState mCurBlendState;
2942a64ee4479728d804e1ecd8d0d10e83f00cf4f29Geoff Lang    gl::ColorF mCurBlendColor;
295493d4f872b528410dee998b38c89a31492a23895daniel@transgaming.com    GLuint mCurSampleMask;
296493d4f872b528410dee998b38c89a31492a23895daniel@transgaming.com
297e33c8bfa0799f8dcd74a0ac88aacd4247f302386daniel@transgaming.com    // Currently applied sampler states
29876b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    std::vector<bool> mForceSetVertexSamplerStates;
29976b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    std::vector<gl::SamplerState> mCurVertexSamplerStates;
300e33c8bfa0799f8dcd74a0ac88aacd4247f302386daniel@transgaming.com
30176b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    std::vector<bool> mForceSetPixelSamplerStates;
30276b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    std::vector<gl::SamplerState> mCurPixelSamplerStates;
303e33c8bfa0799f8dcd74a0ac88aacd4247f302386daniel@transgaming.com
304e33c8bfa0799f8dcd74a0ac88aacd4247f302386daniel@transgaming.com    // Currently applied textures
30576b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    std::vector<unsigned int> mCurVertexTextureSerials;
30676b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    std::vector<unsigned int> mCurPixelTextureSerials;
307e33c8bfa0799f8dcd74a0ac88aacd4247f302386daniel@transgaming.com
30891207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com    unsigned int mAppliedIBSerial;
3096246dc8fecf658cd200a33aa15c7677054daa0d3Jamie Madill    IDirect3DVertexShader9 *mAppliedVertexShader;
3106246dc8fecf658cd200a33aa15c7677054daa0d3Jamie Madill    IDirect3DPixelShader9 *mAppliedPixelShader;
311a5c9a144eb1e99255a7b2c30d19606c43a936bd5Jamie Madill    unsigned int mAppliedProgramSerial;
312a5c9a144eb1e99255a7b2c30d19606c43a936bd5Jamie Madill
313ed36abd83e40bb1c0f4af9ea7314906b86ea3cdddaniel@transgaming.com    rx::dx_VertexConstants mVertexConstants;
314ed36abd83e40bb1c0f4af9ea7314906b86ea3cdddaniel@transgaming.com    rx::dx_PixelConstants mPixelConstants;
315ed36abd83e40bb1c0f4af9ea7314906b86ea3cdddaniel@transgaming.com    bool mDxUniformsDirty;
31691207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com
3172507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    // A pool of event queries that are currently unused.
3182507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    std::vector<IDirect3DQuery9*> mEventQueryPool;
3192507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    VertexShaderCache mVertexShaderCache;
3202507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com    PixelShaderCache mPixelShaderCache;
32167094ee41f584b02e81dba8b2dd4c29463a67880daniel@transgaming.com
322312404870905e1eff46e21632c1c2f2143af4694daniel@transgaming.com    VertexDataManager *mVertexDataManager;
32367094ee41f584b02e81dba8b2dd4c29463a67880daniel@transgaming.com    VertexDeclarationCache mVertexDeclarationCache;
32491207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com
325312404870905e1eff46e21632c1c2f2143af4694daniel@transgaming.com    IndexDataManager *mIndexDataManager;
32650cc725131415c0448592104ae2ad5f2079ebc1bdaniel@transgaming.com    StreamingIndexBufferInterface *mLineLoopIB;
32723ba30e4b0028998ca2a53f0553e2002bf755d74Geoff Lang    StaticIndexBufferInterface *mCountingIB;
328e4e1a33c92ac29b3ff561bba6c7975afc7a01f17daniel@transgaming.com
329e4e1a33c92ac29b3ff561bba6c7975afc7a01f17daniel@transgaming.com    enum { NUM_NULL_COLORBUFFER_CACHE_ENTRIES = 12 };
330e4e1a33c92ac29b3ff561bba6c7975afc7a01f17daniel@transgaming.com    struct NullColorbufferCacheEntry
331e4e1a33c92ac29b3ff561bba6c7975afc7a01f17daniel@transgaming.com    {
332e4e1a33c92ac29b3ff561bba6c7975afc7a01f17daniel@transgaming.com        UINT lruCount;
333e4e1a33c92ac29b3ff561bba6c7975afc7a01f17daniel@transgaming.com        int width;
334e4e1a33c92ac29b3ff561bba6c7975afc7a01f17daniel@transgaming.com        int height;
3353c7fa226aeb81469b93142b54e339f13a46ab835Jamie Madill        gl::FramebufferAttachment *buffer;
336e4e1a33c92ac29b3ff561bba6c7975afc7a01f17daniel@transgaming.com    } mNullColorbufferCache[NUM_NULL_COLORBUFFER_CACHE_ENTRIES];
337e4e1a33c92ac29b3ff561bba6c7975afc7a01f17daniel@transgaming.com    UINT mMaxNullColorbufferLRU;
338e4e1a33c92ac29b3ff561bba6c7975afc7a01f17daniel@transgaming.com
3392507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com};
3402507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com
3412507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com}
3422507f41e4f22f24046ba4d55d13e070d8ea2c9cadaniel@transgaming.com#endif // LIBGLESV2_RENDERER_RENDERER9_H_
343