1 //---------------------------------------------------------------------------// 2 // Copyright (c) 2013-2014 Kyle Lutz <kyle.r.lutz@gmail.com> 3 // 4 // Distributed under the Boost Software License, Version 1.0 5 // See accompanying file LICENSE_1_0.txt or copy at 6 // http://www.boost.org/LICENSE_1_0.txt 7 // 8 // See http://boostorg.github.com/compute for more information. 9 //---------------------------------------------------------------------------// 10 11 #ifndef BOOST_COMPUTE_INTEROP_OPENGL_OPENGL_RENDERBUFFER_HPP 12 #define BOOST_COMPUTE_INTEROP_OPENGL_OPENGL_RENDERBUFFER_HPP 13 14 #include <boost/compute/image/image_object.hpp> 15 #include <boost/compute/interop/opengl/gl.hpp> 16 #include <boost/compute/interop/opengl/cl_gl.hpp> 17 #include <boost/compute/type_traits/type_name.hpp> 18 #include <boost/compute/utility/extents.hpp> 19 20 namespace boost { 21 namespace compute { 22 23 /// \class opengl_renderbuffer 24 /// 25 /// A OpenCL buffer for accessing an OpenGL renderbuffer object. 26 class opengl_renderbuffer : public image_object 27 { 28 public: 29 /// Creates a null OpenGL renderbuffer object. opengl_renderbuffer()30 opengl_renderbuffer() 31 : image_object() 32 { 33 } 34 35 /// Creates a new OpenGL renderbuffer object for \p mem. opengl_renderbuffer(cl_mem mem,bool retain=true)36 explicit opengl_renderbuffer(cl_mem mem, bool retain = true) 37 : image_object(mem, retain) 38 { 39 } 40 41 /// Creates a new OpenGL renderbuffer object in \p context for 42 /// \p renderbuffer with \p flags. 43 /// 44 /// \see_opencl_ref{clCreateFromGLRenderbuffer} opengl_renderbuffer(const context & context,GLuint renderbuffer,cl_mem_flags flags=read_write)45 opengl_renderbuffer(const context &context, 46 GLuint renderbuffer, 47 cl_mem_flags flags = read_write) 48 { 49 cl_int error = 0; 50 51 m_mem = clCreateFromGLRenderbuffer( 52 context, flags, renderbuffer, &error 53 ); 54 55 if(!m_mem){ 56 BOOST_THROW_EXCEPTION(opencl_error(error)); 57 } 58 } 59 60 /// Creates a new OpenGL renderbuffer object as a copy of \p other. opengl_renderbuffer(const opengl_renderbuffer & other)61 opengl_renderbuffer(const opengl_renderbuffer &other) 62 : image_object(other) 63 { 64 } 65 66 /// Copies the OpenGL renderbuffer object from \p other. operator =(const opengl_renderbuffer & other)67 opengl_renderbuffer& operator=(const opengl_renderbuffer &other) 68 { 69 if(this != &other){ 70 image_object::operator=(other); 71 } 72 73 return *this; 74 } 75 76 /// Destroys the OpenGL buffer object. ~opengl_renderbuffer()77 ~opengl_renderbuffer() 78 { 79 } 80 81 /// Returns the size (width, height) of the renderbuffer. size() const82 extents<2> size() const 83 { 84 extents<2> size; 85 size[0] = get_image_info<size_t>(CL_IMAGE_WIDTH); 86 size[1] = get_image_info<size_t>(CL_IMAGE_HEIGHT); 87 return size; 88 } 89 90 /// Returns the origin of the renderbuffer (\c 0, \c 0). origin() const91 extents<2> origin() const 92 { 93 return extents<2>(); 94 } 95 96 /// Returns the OpenGL memory object ID. 97 /// 98 /// \see_opencl_ref{clGetGLObjectInfo} get_opengl_object() const99 GLuint get_opengl_object() const 100 { 101 GLuint object = 0; 102 clGetGLObjectInfo(m_mem, 0, &object); 103 return object; 104 } 105 106 /// Returns the OpenGL memory object type. 107 /// 108 /// \see_opencl_ref{clGetGLObjectInfo} get_opengl_type() const109 cl_gl_object_type get_opengl_type() const 110 { 111 cl_gl_object_type type; 112 clGetGLObjectInfo(m_mem, &type, 0); 113 return type; 114 } 115 }; 116 117 namespace detail { 118 119 // set_kernel_arg() specialization for opengl_renderbuffer 120 template<> 121 struct set_kernel_arg<opengl_renderbuffer> : public set_kernel_arg<image_object> { }; 122 123 } // end detail namespace 124 } // end compute namespace 125 } // end boost namespace 126 127 BOOST_COMPUTE_TYPE_NAME(boost::compute::opengl_renderbuffer, image2d_t) 128 129 #endif // BOOST_COMPUTE_INTEROP_OPENGL_OPENGL_RENDERBUFFER_HPP 130