#pragma once #include "GfxCore/Device.h" #include "GfxCore/States.h" typedef struct __GLsync *GLsync; namespace RBX { namespace Graphics { class FramebufferGL; class ShaderProgramGL; class TextureGL; class ContextGL; class DeviceGL; class DeviceVRGL: public DeviceVR { public: virtual void setup(Device* device) = 0; virtual void submitFrame(DeviceContext* context) = 0; static DeviceVRGL* createCardboard(); }; struct DeviceCapsGL: DeviceCaps { bool ext3; bool extVertexArrayObject; bool extTextureStorage; bool extMapBuffer; bool extMapBufferRange; bool extTimerQuery; bool extDebugMarkers; bool extSync; }; class DeviceContextGL: public DeviceContext { public: DeviceContextGL(DeviceGL* dev); ~DeviceContextGL(); void defineGlobalConstants(size_t dataSize); void clearStates(); void invalidateCachedProgram(); void invalidateCachedTexture(Texture* texture); void invalidateCachedTextureStage(unsigned int stage); virtual void setDefaultAnisotropy(unsigned int value); virtual void updateGlobalConstants(const void* data, size_t dataSize); virtual void bindFramebuffer(Framebuffer* buffer); virtual void clearFramebuffer(unsigned int mask, const float color[4], float depth, unsigned int stencil); virtual void copyFramebuffer(Framebuffer* buffer, Texture* texture); virtual void resolveFramebuffer(Framebuffer* msaaBuffer, Framebuffer* buffer, unsigned int mask); virtual void discardFramebuffer(Framebuffer* buffer, unsigned int mask); virtual void bindProgram(ShaderProgram* program); virtual void setWorldTransforms4x3(const float* data, size_t matrixCount); virtual void setConstant(int handle, const float* data, size_t vectorCount); virtual void bindTexture(unsigned int stage, Texture* texture, const SamplerState& state); virtual void setRasterizerState(const RasterizerState& state); virtual void setBlendState(const BlendState& state); virtual void setDepthState(const DepthState& state); virtual void drawImpl(Geometry* geometry, Geometry::Primitive primitive, unsigned int offset, unsigned int count, unsigned int indexRangeBegin, unsigned int indexRangeEnd); virtual void pushDebugMarkerGroup(const char* text); virtual void popDebugMarkerGroup(); virtual void setDebugMarker(const char* text); private: std::vector globalData; unsigned int globalDataVersion; unsigned int defaultAnisotropy; ShaderProgramGL* cachedProgram; TextureGL* cachedTextures[16]; RasterizerState cachedRasterizerState; BlendState cachedBlendState; DepthState cachedDepthState; DeviceGL* device; }; class DeviceGL: public Device { public: DeviceGL(void* windowHandle); ~DeviceGL(); virtual bool validate(); virtual DeviceContext* beginFrame(); virtual void endFrame(); virtual Framebuffer* getMainFramebuffer(); virtual DeviceVR* getVR(); virtual void setVR(bool enabled); virtual void defineGlobalConstants(size_t dataSize, const std::vector& constants); virtual std::string getAPIName() { return "OpenGL"; } virtual std::string getFeatureLevel(); virtual std::string getShadingLanguage(); virtual std::string createShaderSource(const std::string& path, const std::string& defines, boost::function fileCallback); virtual std::vector createShaderBytecode(const std::string& source, const std::string& target, const std::string& entrypoint); virtual shared_ptr createVertexShader(const std::vector& bytecode); virtual shared_ptr createFragmentShader(const std::vector& bytecode); virtual shared_ptr createShaderProgram(const shared_ptr& vertexShader, const shared_ptr& fragmentShader); virtual shared_ptr createShaderProgramFFP(); virtual shared_ptr createVertexBuffer(size_t elementSize, size_t elementCount, GeometryBuffer::Usage usage); virtual shared_ptr createIndexBuffer(size_t elementSize, size_t elementCount, GeometryBuffer::Usage usage); virtual shared_ptr createVertexLayout(const std::vector& elements); virtual shared_ptr createTexture(Texture::Type type, Texture::Format format, unsigned int width, unsigned int height, unsigned int depth, unsigned int mipLevels, Texture::Usage usage); virtual shared_ptr createRenderbuffer(Texture::Format format, unsigned int width, unsigned int height, unsigned int samples); virtual shared_ptr createGeometryImpl(const shared_ptr& layout, const std::vector >& vertexBuffers, const shared_ptr& indexBuffer, unsigned int baseVertexIndex); virtual shared_ptr createFramebufferImpl(const std::vector >& color, const shared_ptr& depth); virtual const DeviceCaps& getCaps() const { return caps; } virtual DeviceStats getStatistics() const; DeviceContextGL* getImmediateContextGL() { return immediateContext.get(); } const DeviceCapsGL& getCapsGL() const { return caps; } const std::vector& getGlobalConstants() const { return globalConstants; } private: DeviceCapsGL caps; scoped_ptr immediateContext; scoped_ptr mainFramebuffer; std::vector globalConstants; unsigned int frameTimeQueryId; bool frameTimeQueryIssued; GLsync frameEventQueryId; bool frameEventQueryIssued; float gpuTime; scoped_ptr vr; bool vrEnabled; scoped_ptr glContext; }; } }