#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include namespace mbgl { class View; namespace gl { constexpr size_t TextureMax = 64; class Context : private util::noncopyable { public: ~Context(); UniqueProgram createProgram(); UniqueShader createVertexShader(); UniqueShader createFragmentShader(); UniqueTexture createTexture(); UniqueVertexArray createVertexArray(); template VertexBuffer createVertexBuffer(std::vector&& v) { return VertexBuffer { v.size(), createVertexBuffer(v.data(), v.size() * sizeof(V)) }; } template IndexBuffer

createIndexBuffer(std::vector

&& v) { return IndexBuffer

{ createIndexBuffer(v.data(), v.size() * sizeof(P)) }; } template Renderbuffer createRenderbuffer(const std::array& size) { static_assert(type == RenderbufferType::RGBA || type == RenderbufferType::DepthStencil, "invalid renderbuffer type"); return { size, createRenderbuffer(type, size[0], size[1]) }; } Framebuffer createFramebuffer(const Renderbuffer&, const Renderbuffer&); Framebuffer createFramebuffer(const Renderbuffer&); Framebuffer createFramebuffer(const Texture&, const Renderbuffer&); Framebuffer createFramebuffer(const Texture&); // Create a texture from an image with data. template Texture createTexture(const Image& image, TextureUnit unit = 0) { return { {{ image.width, image.height }}, createTexture(image.width, image.height, image.data.get(), unit) }; } // Creates an empty texture with the specified dimensions. Texture createTexture(const std::array& size, TextureUnit unit = 0) { return { size, createTexture(size[0], size[1], nullptr, unit) }; } void bindTexture(Texture&, TextureUnit = 0, TextureFilter = TextureFilter::Nearest, TextureMipMap = TextureMipMap::No); template void bindAttributes(const Shader& shader, const VertexBuffer&, const int8_t* offset) { static_assert(std::is_same::value, "vertex type mismatch"); for (const auto& binding : AttributeBindings()(shader)) { bindAttribute(binding, sizeof(Vertex), offset); } } // Actually remove the objects we marked as abandoned with the above methods. // Only call this while the OpenGL context is exclusive to this thread. void performCleanup(); // Drain pools and remove abandoned objects, in preparation for destroying the store. // Only call this while the OpenGL context is exclusive to this thread. void reset(); bool empty() const { return pooledTextures.empty() && abandonedPrograms.empty() && abandonedShaders.empty() && abandonedBuffers.empty() && abandonedTextures.empty() && abandonedVertexArrays.empty() && abandonedFramebuffers.empty(); } void setDirtyState(); State stencilFunc; State stencilMask; State stencilTest; State stencilOp; State depthRange; State depthMask; State depthTest; State depthFunc; State blend; State blendFunc; State blendColor; State colorMask; State clearDepth; State clearColor; State clearStencil; State program; State lineWidth; State activeTexture; State bindFramebuffer; State viewport; State bindRenderbuffer; #if not MBGL_USE_GLES2 State pixelZoom; State rasterPos; #endif // MBGL_USE_GLES2 std::array, 2> texture; State vertexBuffer; State elementBuffer; State vertexArrayObject; private: UniqueBuffer createVertexBuffer(const void* data, std::size_t size); UniqueBuffer createIndexBuffer(const void* data, std::size_t size); UniqueTexture createTexture(uint16_t width, uint16_t height, const void* data, TextureUnit); UniqueFramebuffer createFramebuffer(); UniqueRenderbuffer createRenderbuffer(RenderbufferType, uint16_t width, uint16_t height); void bindAttribute(const AttributeBinding&, std::size_t stride, const int8_t* offset); friend detail::ProgramDeleter; friend detail::ShaderDeleter; friend detail::BufferDeleter; friend detail::TextureDeleter; friend detail::VertexArrayDeleter; friend detail::FramebufferDeleter; friend detail::RenderbufferDeleter; std::vector pooledTextures; std::vector abandonedPrograms; std::vector abandonedShaders; std::vector abandonedBuffers; std::vector abandonedTextures; std::vector abandonedVertexArrays; std::vector abandonedFramebuffers; std::vector abandonedRenderbuffers; }; } // namespace gl } // namespace mbgl