+\r
+void ogl_device::enable(GLenum cap)\r
+{\r
+ auto& val = caps_[cap];\r
+ if(!val)\r
+ {\r
+ glEnable(cap);\r
+ val = true;\r
+ }\r
+}\r
+\r
+void ogl_device::disable(GLenum cap)\r
+{\r
+ auto& val = caps_[cap];\r
+ if(val)\r
+ {\r
+ glDisable(cap);\r
+ val = false;\r
+ }\r
+}\r
+\r
+void ogl_device::viewport(size_t x, size_t y, size_t width, size_t height)\r
+{\r
+ if(x != viewport_[0] || y != viewport_[1] || width != viewport_[2] || height != viewport_[3])\r
+ { \r
+ glViewport(x, y, width, height);\r
+ viewport_[0] = x;\r
+ viewport_[1] = y;\r
+ viewport_[2] = width;\r
+ viewport_[3] = height;\r
+ }\r
+}\r
+\r
+void ogl_device::scissor(size_t x, size_t y, size_t width, size_t height)\r
+{\r
+ if(x != scissor_[0] || y != scissor_[1] || width != scissor_[2] || height != scissor_[3])\r
+ { \r
+ glScissor(x, y, width, height);\r
+ scissor_[0] = x;\r
+ scissor_[1] = y;\r
+ scissor_[2] = width;\r
+ scissor_[3] = height;\r
+ }\r
+}\r
+\r
+void ogl_device::stipple_pattern(const GLubyte* pattern)\r
+{\r
+ if(pattern_ != pattern)\r
+ { \r
+ glPolygonStipple(pattern);\r
+ pattern_ = pattern;\r
+ }\r
+}\r
+\r
+void ogl_device::attach(device_buffer& texture)\r
+{ \r
+ if(attached_texture_ != texture.id())\r
+ {\r
+ GL(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + 0, GL_TEXTURE_2D, texture.id(), 0));\r
+ attached_texture_ = texture.id();\r
+ }\r
+}\r
+\r
+void ogl_device::clear(device_buffer& texture)\r
+{ \r
+ attach(texture);\r
+ GL(glClear(GL_COLOR_BUFFER_BIT));\r
+}\r
+\r
+void ogl_device::use(shader& shader)\r
+{\r
+ if(active_shader_ != shader.id())\r
+ { \r
+ GL(glUseProgramObjectARB(shader.id())); \r
+ active_shader_ = shader.id();\r
+ }\r
+}\r
+\r
+void ogl_device::blend_func(int c1, int c2, int a1, int a2)\r
+{\r
+ std::array<int, 4> func = {c1, c2, a1, a2};\r
+\r
+ if(blend_func_ != func)\r
+ {\r
+ blend_func_ = func;\r
+ GL(glBlendFuncSeparate(c1, c2, a1, a2));\r
+ }\r
+}\r
+\r
+void ogl_device::blend_func(int c1, int c2)\r
+{\r
+ blend_func(c1, c2, c1, c2);\r
+}\r
+\r
+}}\r
+\r