github.com/acrespo/mobile@v0.0.0-20190107162257-dc0771356504/gl/interface.go (about)

     1  // Copyright 2014 The Go Authors.  All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package gl
     6  
     7  // Context is an OpenGL ES context.
     8  //
     9  // A Context has a method for every GL function supported by ES 2 or later.
    10  // In a program compiled with ES 3 support, a Context is also a Context3.
    11  // For example, a program can:
    12  //
    13  //	func f(glctx gl.Context) {
    14  //		glctx.(gl.Context3).BlitFramebuffer(...)
    15  //	}
    16  //
    17  // Calls are not safe for concurrent use. However calls can be made from
    18  // any goroutine, the gl package removes the notion of thread-local
    19  // context.
    20  //
    21  // Contexts are independent. Two contexts can be used concurrently.
    22  type Context interface {
    23  	// ActiveTexture sets the active texture unit.
    24  	//
    25  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glActiveTexture.xhtml
    26  	ActiveTexture(texture Enum)
    27  
    28  	// AttachShader attaches a shader to a program.
    29  	//
    30  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glAttachShader.xhtml
    31  	AttachShader(p Program, s Shader)
    32  
    33  	// BindAttribLocation binds a vertex attribute index with a named
    34  	// variable.
    35  	//
    36  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glBindAttribLocation.xhtml
    37  	BindAttribLocation(p Program, a Attrib, name string)
    38  
    39  	// BindBuffer binds a buffer.
    40  	//
    41  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glBindBuffer.xhtml
    42  	BindBuffer(target Enum, b Buffer)
    43  
    44  	// BindFramebuffer binds a framebuffer.
    45  	//
    46  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glBindFramebuffer.xhtml
    47  	BindFramebuffer(target Enum, fb Framebuffer)
    48  
    49  	// BindRenderbuffer binds a render buffer.
    50  	//
    51  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glBindRenderbuffer.xhtml
    52  	BindRenderbuffer(target Enum, rb Renderbuffer)
    53  
    54  	// BindTexture binds a texture.
    55  	//
    56  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glBindTexture.xhtml
    57  	BindTexture(target Enum, t Texture)
    58  
    59  	// BindVertexArray binds a vertex array.
    60  	//
    61  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glBindVertexArray.xhtml
    62  	BindVertexArray(rb VertexArray)
    63  
    64  	// BlendColor sets the blend color.
    65  	//
    66  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glBlendColor.xhtml
    67  	BlendColor(red, green, blue, alpha float32)
    68  
    69  	// BlendEquation sets both RGB and alpha blend equations.
    70  	//
    71  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glBlendEquation.xhtml
    72  	BlendEquation(mode Enum)
    73  
    74  	// BlendEquationSeparate sets RGB and alpha blend equations separately.
    75  	//
    76  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glBlendEquationSeparate.xhtml
    77  	BlendEquationSeparate(modeRGB, modeAlpha Enum)
    78  
    79  	// BlendFunc sets the pixel blending factors.
    80  	//
    81  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glBlendFunc.xhtml
    82  	BlendFunc(sfactor, dfactor Enum)
    83  
    84  	// BlendFunc sets the pixel RGB and alpha blending factors separately.
    85  	//
    86  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glBlendFuncSeparate.xhtml
    87  	BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha Enum)
    88  
    89  	// BufferData creates a new data store for the bound buffer object.
    90  	//
    91  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glBufferData.xhtml
    92  	BufferData(target Enum, src []byte, usage Enum)
    93  
    94  	// BufferInit creates a new uninitialized data store for the bound buffer object.
    95  	//
    96  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glBufferData.xhtml
    97  	BufferInit(target Enum, size int, usage Enum)
    98  
    99  	// BufferSubData sets some of data in the bound buffer object.
   100  	//
   101  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glBufferSubData.xhtml
   102  	BufferSubData(target Enum, offset int, data []byte)
   103  
   104  	// CheckFramebufferStatus reports the completeness status of the
   105  	// active framebuffer.
   106  	//
   107  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glCheckFramebufferStatus.xhtml
   108  	CheckFramebufferStatus(target Enum) Enum
   109  
   110  	// Clear clears the window.
   111  	//
   112  	// The behavior of Clear is influenced by the pixel ownership test,
   113  	// the scissor test, dithering, and the buffer writemasks.
   114  	//
   115  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glClear.xhtml
   116  	Clear(mask Enum)
   117  
   118  	// ClearColor specifies the RGBA values used to clear color buffers.
   119  	//
   120  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glClearColor.xhtml
   121  	ClearColor(red, green, blue, alpha float32)
   122  
   123  	// ClearDepthf sets the depth value used to clear the depth buffer.
   124  	//
   125  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glClearDepthf.xhtml
   126  	ClearDepthf(d float32)
   127  
   128  	// ClearStencil sets the index used to clear the stencil buffer.
   129  	//
   130  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glClearStencil.xhtml
   131  	ClearStencil(s int)
   132  
   133  	// ColorMask specifies whether color components in the framebuffer
   134  	// can be written.
   135  	//
   136  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glColorMask.xhtml
   137  	ColorMask(red, green, blue, alpha bool)
   138  
   139  	// CompileShader compiles the source code of s.
   140  	//
   141  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glCompileShader.xhtml
   142  	CompileShader(s Shader)
   143  
   144  	// CompressedTexImage2D writes a compressed 2D texture.
   145  	//
   146  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glCompressedTexImage2D.xhtml
   147  	CompressedTexImage2D(target Enum, level int, internalformat Enum, width, height, border int, data []byte)
   148  
   149  	// CompressedTexSubImage2D writes a subregion of a compressed 2D texture.
   150  	//
   151  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glCompressedTexSubImage2D.xhtml
   152  	CompressedTexSubImage2D(target Enum, level, xoffset, yoffset, width, height int, format Enum, data []byte)
   153  
   154  	// CopyTexImage2D writes a 2D texture from the current framebuffer.
   155  	//
   156  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glCopyTexImage2D.xhtml
   157  	CopyTexImage2D(target Enum, level int, internalformat Enum, x, y, width, height, border int)
   158  
   159  	// CopyTexSubImage2D writes a 2D texture subregion from the
   160  	// current framebuffer.
   161  	//
   162  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glCopyTexSubImage2D.xhtml
   163  	CopyTexSubImage2D(target Enum, level, xoffset, yoffset, x, y, width, height int)
   164  
   165  	// CreateBuffer creates a buffer object.
   166  	//
   167  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGenBuffers.xhtml
   168  	CreateBuffer() Buffer
   169  
   170  	// CreateFramebuffer creates a framebuffer object.
   171  	//
   172  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGenFramebuffers.xhtml
   173  	CreateFramebuffer() Framebuffer
   174  
   175  	// CreateProgram creates a new empty program object.
   176  	//
   177  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glCreateProgram.xhtml
   178  	CreateProgram() Program
   179  
   180  	// CreateRenderbuffer create a renderbuffer object.
   181  	//
   182  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGenRenderbuffers.xhtml
   183  	CreateRenderbuffer() Renderbuffer
   184  
   185  	// CreateShader creates a new empty shader object.
   186  	//
   187  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glCreateShader.xhtml
   188  	CreateShader(ty Enum) Shader
   189  
   190  	// CreateTexture creates a texture object.
   191  	//
   192  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGenTextures.xhtml
   193  	CreateTexture() Texture
   194  
   195  	// CreateTVertexArray creates a vertex array.
   196  	//
   197  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGenVertexArrays.xhtml
   198  	CreateVertexArray() VertexArray
   199  
   200  	// CullFace specifies which polygons are candidates for culling.
   201  	//
   202  	// Valid modes: FRONT, BACK, FRONT_AND_BACK.
   203  	//
   204  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glCullFace.xhtml
   205  	CullFace(mode Enum)
   206  
   207  	// DeleteBuffer deletes the given buffer object.
   208  	//
   209  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glDeleteBuffers.xhtml
   210  	DeleteBuffer(v Buffer)
   211  
   212  	// DeleteFramebuffer deletes the given framebuffer object.
   213  	//
   214  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glDeleteFramebuffers.xhtml
   215  	DeleteFramebuffer(v Framebuffer)
   216  
   217  	// DeleteProgram deletes the given program object.
   218  	//
   219  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glDeleteProgram.xhtml
   220  	DeleteProgram(p Program)
   221  
   222  	// DeleteRenderbuffer deletes the given render buffer object.
   223  	//
   224  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glDeleteRenderbuffers.xhtml
   225  	DeleteRenderbuffer(v Renderbuffer)
   226  
   227  	// DeleteShader deletes shader s.
   228  	//
   229  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glDeleteShader.xhtml
   230  	DeleteShader(s Shader)
   231  
   232  	// DeleteTexture deletes the given texture object.
   233  	//
   234  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glDeleteTextures.xhtml
   235  	DeleteTexture(v Texture)
   236  
   237  	// DeleteVertexArray deletes the given render buffer object.
   238  	//
   239  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glDeleteVertexArrays.xhtml
   240  	DeleteVertexArray(v VertexArray)
   241  
   242  	// DepthFunc sets the function used for depth buffer comparisons.
   243  	//
   244  	// Valid fn values:
   245  	//	NEVER
   246  	//	LESS
   247  	//	EQUAL
   248  	//	LEQUAL
   249  	//	GREATER
   250  	//	NOTEQUAL
   251  	//	GEQUAL
   252  	//	ALWAYS
   253  	//
   254  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glDepthFunc.xhtml
   255  	DepthFunc(fn Enum)
   256  
   257  	// DepthMask sets the depth buffer enabled for writing.
   258  	//
   259  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glDepthMask.xhtml
   260  	DepthMask(flag bool)
   261  
   262  	// DepthRangef sets the mapping from normalized device coordinates to
   263  	// window coordinates.
   264  	//
   265  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glDepthRangef.xhtml
   266  	DepthRangef(n, f float32)
   267  
   268  	// DetachShader detaches the shader s from the program p.
   269  	//
   270  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glDetachShader.xhtml
   271  	DetachShader(p Program, s Shader)
   272  
   273  	// Disable disables various GL capabilities.
   274  	//
   275  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glDisable.xhtml
   276  	Disable(cap Enum)
   277  
   278  	// DisableVertexAttribArray disables a vertex attribute array.
   279  	//
   280  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glDisableVertexAttribArray.xhtml
   281  	DisableVertexAttribArray(a Attrib)
   282  
   283  	// DrawArrays renders geometric primitives from the bound data.
   284  	//
   285  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glDrawArrays.xhtml
   286  	DrawArrays(mode Enum, first, count int)
   287  
   288  	// DrawElements renders primitives from a bound buffer.
   289  	//
   290  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glDrawElements.xhtml
   291  	DrawElements(mode Enum, count int, ty Enum, offset int)
   292  
   293  	// TODO(crawshaw): consider DrawElements8 / DrawElements16 / DrawElements32
   294  
   295  	// Enable enables various GL capabilities.
   296  	//
   297  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glEnable.xhtml
   298  	Enable(cap Enum)
   299  
   300  	// EnableVertexAttribArray enables a vertex attribute array.
   301  	//
   302  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glEnableVertexAttribArray.xhtml
   303  	EnableVertexAttribArray(a Attrib)
   304  
   305  	// Finish blocks until the effects of all previously called GL
   306  	// commands are complete.
   307  	//
   308  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glFinish.xhtml
   309  	Finish()
   310  
   311  	// Flush empties all buffers. It does not block.
   312  	//
   313  	// An OpenGL implementation may buffer network communication,
   314  	// the command stream, or data inside the graphics accelerator.
   315  	//
   316  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glFlush.xhtml
   317  	Flush()
   318  
   319  	// FramebufferRenderbuffer attaches rb to the current frame buffer.
   320  	//
   321  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glFramebufferRenderbuffer.xhtml
   322  	FramebufferRenderbuffer(target, attachment, rbTarget Enum, rb Renderbuffer)
   323  
   324  	// FramebufferTexture2D attaches the t to the current frame buffer.
   325  	//
   326  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glFramebufferTexture2D.xhtml
   327  	FramebufferTexture2D(target, attachment, texTarget Enum, t Texture, level int)
   328  
   329  	// FrontFace defines which polygons are front-facing.
   330  	//
   331  	// Valid modes: CW, CCW.
   332  	//
   333  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glFrontFace.xhtml
   334  	FrontFace(mode Enum)
   335  
   336  	// GenerateMipmap generates mipmaps for the current texture.
   337  	//
   338  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGenerateMipmap.xhtml
   339  	GenerateMipmap(target Enum)
   340  
   341  	// GetActiveAttrib returns details about an active attribute variable.
   342  	// A value of 0 for index selects the first active attribute variable.
   343  	// Permissible values for index range from 0 to the number of active
   344  	// attribute variables minus 1.
   345  	//
   346  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetActiveAttrib.xhtml
   347  	GetActiveAttrib(p Program, index uint32) (name string, size int, ty Enum)
   348  
   349  	// GetActiveUniform returns details about an active uniform variable.
   350  	// A value of 0 for index selects the first active uniform variable.
   351  	// Permissible values for index range from 0 to the number of active
   352  	// uniform variables minus 1.
   353  	//
   354  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetActiveUniform.xhtml
   355  	GetActiveUniform(p Program, index uint32) (name string, size int, ty Enum)
   356  
   357  	// GetAttachedShaders returns the shader objects attached to program p.
   358  	//
   359  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetAttachedShaders.xhtml
   360  	GetAttachedShaders(p Program) []Shader
   361  
   362  	// GetAttribLocation returns the location of an attribute variable.
   363  	//
   364  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetAttribLocation.xhtml
   365  	GetAttribLocation(p Program, name string) Attrib
   366  
   367  	// GetBooleanv returns the boolean values of parameter pname.
   368  	//
   369  	// Many boolean parameters can be queried more easily using IsEnabled.
   370  	//
   371  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGet.xhtml
   372  	GetBooleanv(dst []bool, pname Enum)
   373  
   374  	// GetFloatv returns the float values of parameter pname.
   375  	//
   376  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGet.xhtml
   377  	GetFloatv(dst []float32, pname Enum)
   378  
   379  	// GetIntegerv returns the int values of parameter pname.
   380  	//
   381  	// Single values may be queried more easily using GetInteger.
   382  	//
   383  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGet.xhtml
   384  	GetIntegerv(dst []int32, pname Enum)
   385  
   386  	// GetInteger returns the int value of parameter pname.
   387  	//
   388  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGet.xhtml
   389  	GetInteger(pname Enum) int
   390  
   391  	// GetBufferParameteri returns a parameter for the active buffer.
   392  	//
   393  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetBufferParameter.xhtml
   394  	GetBufferParameteri(target, value Enum) int
   395  
   396  	// GetError returns the next error.
   397  	//
   398  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetError.xhtml
   399  	GetError() Enum
   400  
   401  	// GetFramebufferAttachmentParameteri returns attachment parameters
   402  	// for the active framebuffer object.
   403  	//
   404  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetFramebufferAttachmentParameteriv.xhtml
   405  	GetFramebufferAttachmentParameteri(target, attachment, pname Enum) int
   406  
   407  	// GetProgrami returns a parameter value for a program.
   408  	//
   409  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetProgramiv.xhtml
   410  	GetProgrami(p Program, pname Enum) int
   411  
   412  	// GetProgramInfoLog returns the information log for a program.
   413  	//
   414  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetProgramInfoLog.xhtml
   415  	GetProgramInfoLog(p Program) string
   416  
   417  	// GetRenderbufferParameteri returns a parameter value for a render buffer.
   418  	//
   419  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetRenderbufferParameteriv.xhtml
   420  	GetRenderbufferParameteri(target, pname Enum) int
   421  
   422  	// GetShaderi returns a parameter value for a shader.
   423  	//
   424  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetShaderiv.xhtml
   425  	GetShaderi(s Shader, pname Enum) int
   426  
   427  	// GetShaderInfoLog returns the information log for a shader.
   428  	//
   429  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetShaderInfoLog.xhtml
   430  	GetShaderInfoLog(s Shader) string
   431  
   432  	// GetShaderPrecisionFormat returns range and precision limits for
   433  	// shader types.
   434  	//
   435  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetShaderPrecisionFormat.xhtml
   436  	GetShaderPrecisionFormat(shadertype, precisiontype Enum) (rangeLow, rangeHigh, precision int)
   437  
   438  	// GetShaderSource returns source code of shader s.
   439  	//
   440  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetShaderSource.xhtml
   441  	GetShaderSource(s Shader) string
   442  
   443  	// GetString reports current GL state.
   444  	//
   445  	// Valid name values:
   446  	//	EXTENSIONS
   447  	//	RENDERER
   448  	//	SHADING_LANGUAGE_VERSION
   449  	//	VENDOR
   450  	//	VERSION
   451  	//
   452  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetString.xhtml
   453  	GetString(pname Enum) string
   454  
   455  	// GetTexParameterfv returns the float values of a texture parameter.
   456  	//
   457  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetTexParameter.xhtml
   458  	GetTexParameterfv(dst []float32, target, pname Enum)
   459  
   460  	// GetTexParameteriv returns the int values of a texture parameter.
   461  	//
   462  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetTexParameter.xhtml
   463  	GetTexParameteriv(dst []int32, target, pname Enum)
   464  
   465  	// GetUniformfv returns the float values of a uniform variable.
   466  	//
   467  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetUniform.xhtml
   468  	GetUniformfv(dst []float32, src Uniform, p Program)
   469  
   470  	// GetUniformiv returns the float values of a uniform variable.
   471  	//
   472  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetUniform.xhtml
   473  	GetUniformiv(dst []int32, src Uniform, p Program)
   474  
   475  	// GetUniformLocation returns the location of a uniform variable.
   476  	//
   477  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetUniformLocation.xhtml
   478  	GetUniformLocation(p Program, name string) Uniform
   479  
   480  	// GetVertexAttribf reads the float value of a vertex attribute.
   481  	//
   482  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetVertexAttrib.xhtml
   483  	GetVertexAttribf(src Attrib, pname Enum) float32
   484  
   485  	// GetVertexAttribfv reads float values of a vertex attribute.
   486  	//
   487  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetVertexAttrib.xhtml
   488  	GetVertexAttribfv(dst []float32, src Attrib, pname Enum)
   489  
   490  	// GetVertexAttribi reads the int value of a vertex attribute.
   491  	//
   492  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetVertexAttrib.xhtml
   493  	GetVertexAttribi(src Attrib, pname Enum) int32
   494  
   495  	// GetVertexAttribiv reads int values of a vertex attribute.
   496  	//
   497  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetVertexAttrib.xhtml
   498  	GetVertexAttribiv(dst []int32, src Attrib, pname Enum)
   499  
   500  	// TODO(crawshaw): glGetVertexAttribPointerv
   501  
   502  	// Hint sets implementation-specific modes.
   503  	//
   504  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glHint.xhtml
   505  	Hint(target, mode Enum)
   506  
   507  	// IsBuffer reports if b is a valid buffer.
   508  	//
   509  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glIsBuffer.xhtml
   510  	IsBuffer(b Buffer) bool
   511  
   512  	// IsEnabled reports if cap is an enabled capability.
   513  	//
   514  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glIsEnabled.xhtml
   515  	IsEnabled(cap Enum) bool
   516  
   517  	// IsFramebuffer reports if fb is a valid frame buffer.
   518  	//
   519  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glIsFramebuffer.xhtml
   520  	IsFramebuffer(fb Framebuffer) bool
   521  
   522  	// IsProgram reports if p is a valid program object.
   523  	//
   524  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glIsProgram.xhtml
   525  	IsProgram(p Program) bool
   526  
   527  	// IsRenderbuffer reports if rb is a valid render buffer.
   528  	//
   529  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glIsRenderbuffer.xhtml
   530  	IsRenderbuffer(rb Renderbuffer) bool
   531  
   532  	// IsShader reports if s is valid shader.
   533  	//
   534  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glIsShader.xhtml
   535  	IsShader(s Shader) bool
   536  
   537  	// IsTexture reports if t is a valid texture.
   538  	//
   539  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glIsTexture.xhtml
   540  	IsTexture(t Texture) bool
   541  
   542  	// LineWidth specifies the width of lines.
   543  	//
   544  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glLineWidth.xhtml
   545  	LineWidth(width float32)
   546  
   547  	// LinkProgram links the specified program.
   548  	//
   549  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glLinkProgram.xhtml
   550  	LinkProgram(p Program)
   551  
   552  	// PixelStorei sets pixel storage parameters.
   553  	//
   554  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glPixelStorei.xhtml
   555  	PixelStorei(pname Enum, param int32)
   556  
   557  	// PolygonOffset sets the scaling factors for depth offsets.
   558  	//
   559  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glPolygonOffset.xhtml
   560  	PolygonOffset(factor, units float32)
   561  
   562  	// ReadPixels returns pixel data from a buffer.
   563  	//
   564  	// In GLES 3, the source buffer is controlled with ReadBuffer.
   565  	//
   566  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glReadPixels.xhtml
   567  	ReadPixels(dst []byte, x, y, width, height int, format, ty Enum)
   568  
   569  	// ReleaseShaderCompiler frees resources allocated by the shader compiler.
   570  	//
   571  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glReleaseShaderCompiler.xhtml
   572  	ReleaseShaderCompiler()
   573  
   574  	// RenderbufferStorage establishes the data storage, format, and
   575  	// dimensions of a renderbuffer object's image.
   576  	//
   577  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glRenderbufferStorage.xhtml
   578  	RenderbufferStorage(target, internalFormat Enum, width, height int)
   579  
   580  	// SampleCoverage sets multisample coverage parameters.
   581  	//
   582  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glSampleCoverage.xhtml
   583  	SampleCoverage(value float32, invert bool)
   584  
   585  	// Scissor defines the scissor box rectangle, in window coordinates.
   586  	//
   587  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glScissor.xhtml
   588  	Scissor(x, y, width, height int32)
   589  
   590  	// TODO(crawshaw): ShaderBinary
   591  
   592  	// ShaderSource sets the source code of s to the given source code.
   593  	//
   594  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glShaderSource.xhtml
   595  	ShaderSource(s Shader, src string)
   596  
   597  	// StencilFunc sets the front and back stencil test reference value.
   598  	//
   599  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glStencilFunc.xhtml
   600  	StencilFunc(fn Enum, ref int, mask uint32)
   601  
   602  	// StencilFunc sets the front or back stencil test reference value.
   603  	//
   604  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glStencilFuncSeparate.xhtml
   605  	StencilFuncSeparate(face, fn Enum, ref int, mask uint32)
   606  
   607  	// StencilMask controls the writing of bits in the stencil planes.
   608  	//
   609  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glStencilMask.xhtml
   610  	StencilMask(mask uint32)
   611  
   612  	// StencilMaskSeparate controls the writing of bits in the stencil planes.
   613  	//
   614  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glStencilMaskSeparate.xhtml
   615  	StencilMaskSeparate(face Enum, mask uint32)
   616  
   617  	// StencilOp sets front and back stencil test actions.
   618  	//
   619  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glStencilOp.xhtml
   620  	StencilOp(fail, zfail, zpass Enum)
   621  
   622  	// StencilOpSeparate sets front or back stencil tests.
   623  	//
   624  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glStencilOpSeparate.xhtml
   625  	StencilOpSeparate(face, sfail, dpfail, dppass Enum)
   626  
   627  	// TexImage2D writes a 2D texture image.
   628  	//
   629  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glTexImage2D.xhtml
   630  	TexImage2D(target Enum, level int, internalFormat int, width, height int, format Enum, ty Enum, data []byte)
   631  
   632  	// TexSubImage2D writes a subregion of a 2D texture image.
   633  	//
   634  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glTexSubImage2D.xhtml
   635  	TexSubImage2D(target Enum, level int, x, y, width, height int, format, ty Enum, data []byte)
   636  
   637  	// TexParameterf sets a float texture parameter.
   638  	//
   639  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glTexParameter.xhtml
   640  	TexParameterf(target, pname Enum, param float32)
   641  
   642  	// TexParameterfv sets a float texture parameter array.
   643  	//
   644  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glTexParameter.xhtml
   645  	TexParameterfv(target, pname Enum, params []float32)
   646  
   647  	// TexParameteri sets an integer texture parameter.
   648  	//
   649  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glTexParameter.xhtml
   650  	TexParameteri(target, pname Enum, param int)
   651  
   652  	// TexParameteriv sets an integer texture parameter array.
   653  	//
   654  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glTexParameter.xhtml
   655  	TexParameteriv(target, pname Enum, params []int32)
   656  
   657  	// Uniform1f writes a float uniform variable.
   658  	//
   659  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
   660  	Uniform1f(dst Uniform, v float32)
   661  
   662  	// Uniform1fv writes a [len(src)]float uniform array.
   663  	//
   664  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
   665  	Uniform1fv(dst Uniform, src []float32)
   666  
   667  	// Uniform1i writes an int uniform variable.
   668  	//
   669  	// Uniform1i and Uniform1iv are the only two functions that may be used
   670  	// to load uniform variables defined as sampler types. Loading samplers
   671  	// with any other function will result in a INVALID_OPERATION error.
   672  	//
   673  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
   674  	Uniform1i(dst Uniform, v int)
   675  
   676  	// Uniform1iv writes a int uniform array of len(src) elements.
   677  	//
   678  	// Uniform1i and Uniform1iv are the only two functions that may be used
   679  	// to load uniform variables defined as sampler types. Loading samplers
   680  	// with any other function will result in a INVALID_OPERATION error.
   681  	//
   682  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
   683  	Uniform1iv(dst Uniform, src []int32)
   684  
   685  	// Uniform2f writes a vec2 uniform variable.
   686  	//
   687  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
   688  	Uniform2f(dst Uniform, v0, v1 float32)
   689  
   690  	// Uniform2fv writes a vec2 uniform array of len(src)/2 elements.
   691  	//
   692  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
   693  	Uniform2fv(dst Uniform, src []float32)
   694  
   695  	// Uniform2i writes an ivec2 uniform variable.
   696  	//
   697  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
   698  	Uniform2i(dst Uniform, v0, v1 int)
   699  
   700  	// Uniform2iv writes an ivec2 uniform array of len(src)/2 elements.
   701  	//
   702  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
   703  	Uniform2iv(dst Uniform, src []int32)
   704  
   705  	// Uniform3f writes a vec3 uniform variable.
   706  	//
   707  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
   708  	Uniform3f(dst Uniform, v0, v1, v2 float32)
   709  
   710  	// Uniform3fv writes a vec3 uniform array of len(src)/3 elements.
   711  	//
   712  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
   713  	Uniform3fv(dst Uniform, src []float32)
   714  
   715  	// Uniform3i writes an ivec3 uniform variable.
   716  	//
   717  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
   718  	Uniform3i(dst Uniform, v0, v1, v2 int32)
   719  
   720  	// Uniform3iv writes an ivec3 uniform array of len(src)/3 elements.
   721  	//
   722  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
   723  	Uniform3iv(dst Uniform, src []int32)
   724  
   725  	// Uniform4f writes a vec4 uniform variable.
   726  	//
   727  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
   728  	Uniform4f(dst Uniform, v0, v1, v2, v3 float32)
   729  
   730  	// Uniform4fv writes a vec4 uniform array of len(src)/4 elements.
   731  	//
   732  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
   733  	Uniform4fv(dst Uniform, src []float32)
   734  
   735  	// Uniform4i writes an ivec4 uniform variable.
   736  	//
   737  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
   738  	Uniform4i(dst Uniform, v0, v1, v2, v3 int32)
   739  
   740  	// Uniform4i writes an ivec4 uniform array of len(src)/4 elements.
   741  	//
   742  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
   743  	Uniform4iv(dst Uniform, src []int32)
   744  
   745  	// UniformMatrix2fv writes 2x2 matrices. Each matrix uses four
   746  	// float32 values, so the number of matrices written is len(src)/4.
   747  	//
   748  	// Each matrix must be supplied in column major order.
   749  	//
   750  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
   751  	UniformMatrix2fv(dst Uniform, src []float32)
   752  
   753  	// UniformMatrix3fv writes 3x3 matrices. Each matrix uses nine
   754  	// float32 values, so the number of matrices written is len(src)/9.
   755  	//
   756  	// Each matrix must be supplied in column major order.
   757  	//
   758  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
   759  	UniformMatrix3fv(dst Uniform, src []float32)
   760  
   761  	// UniformMatrix4fv writes 4x4 matrices. Each matrix uses 16
   762  	// float32 values, so the number of matrices written is len(src)/16.
   763  	//
   764  	// Each matrix must be supplied in column major order.
   765  	//
   766  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
   767  	UniformMatrix4fv(dst Uniform, src []float32)
   768  
   769  	// UseProgram sets the active program.
   770  	//
   771  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glUseProgram.xhtml
   772  	UseProgram(p Program)
   773  
   774  	// ValidateProgram checks to see whether the executables contained in
   775  	// program can execute given the current OpenGL state.
   776  	//
   777  	// Typically only used for debugging.
   778  	//
   779  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glValidateProgram.xhtml
   780  	ValidateProgram(p Program)
   781  
   782  	// VertexAttrib1f writes a float vertex attribute.
   783  	//
   784  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glVertexAttrib.xhtml
   785  	VertexAttrib1f(dst Attrib, x float32)
   786  
   787  	// VertexAttrib1fv writes a float vertex attribute.
   788  	//
   789  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glVertexAttrib.xhtml
   790  	VertexAttrib1fv(dst Attrib, src []float32)
   791  
   792  	// VertexAttrib2f writes a vec2 vertex attribute.
   793  	//
   794  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glVertexAttrib.xhtml
   795  	VertexAttrib2f(dst Attrib, x, y float32)
   796  
   797  	// VertexAttrib2fv writes a vec2 vertex attribute.
   798  	//
   799  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glVertexAttrib.xhtml
   800  	VertexAttrib2fv(dst Attrib, src []float32)
   801  
   802  	// VertexAttrib3f writes a vec3 vertex attribute.
   803  	//
   804  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glVertexAttrib.xhtml
   805  	VertexAttrib3f(dst Attrib, x, y, z float32)
   806  
   807  	// VertexAttrib3fv writes a vec3 vertex attribute.
   808  	//
   809  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glVertexAttrib.xhtml
   810  	VertexAttrib3fv(dst Attrib, src []float32)
   811  
   812  	// VertexAttrib4f writes a vec4 vertex attribute.
   813  	//
   814  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glVertexAttrib.xhtml
   815  	VertexAttrib4f(dst Attrib, x, y, z, w float32)
   816  
   817  	// VertexAttrib4fv writes a vec4 vertex attribute.
   818  	//
   819  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glVertexAttrib.xhtml
   820  	VertexAttrib4fv(dst Attrib, src []float32)
   821  
   822  	// VertexAttribPointer uses a bound buffer to define vertex attribute data.
   823  	//
   824  	// Direct use of VertexAttribPointer to load data into OpenGL is not
   825  	// supported via the Go bindings. Instead, use BindBuffer with an
   826  	// ARRAY_BUFFER and then fill it using BufferData.
   827  	//
   828  	// The size argument specifies the number of components per attribute,
   829  	// between 1-4. The stride argument specifies the byte offset between
   830  	// consecutive vertex attributes.
   831  	//
   832  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glVertexAttribPointer.xhtml
   833  	VertexAttribPointer(dst Attrib, size int, ty Enum, normalized bool, stride, offset int)
   834  
   835  	// Viewport sets the viewport, an affine transformation that
   836  	// normalizes device coordinates to window coordinates.
   837  	//
   838  	// http://www.khronos.org/opengles/sdk/docs/man3/html/glViewport.xhtml
   839  	Viewport(x, y, width, height int)
   840  }
   841  
   842  // Context3 is an OpenGL ES 3 context.
   843  //
   844  // When the gl package is compiled with GL ES 3 support, the produced
   845  // Context object also implements the Context3 interface.
   846  type Context3 interface {
   847  	Context
   848  
   849  	// BlitFramebuffer copies a block of pixels between framebuffers.
   850  	//
   851  	// https://www.khronos.org/opengles/sdk/docs/man3/html/glBlitFramebuffer.xhtml
   852  	BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1 int, mask uint, filter Enum)
   853  }
   854  
   855  // Worker is used by display driver code to execute OpenGL calls.
   856  //
   857  // Typically display driver code creates a gl.Context for an application,
   858  // and along with it establishes a locked OS thread to execute the cgo
   859  // calls:
   860  //
   861  //	go func() {
   862  //		runtime.LockOSThread()
   863  //		// ... platform-specific cgo call to bind a C OpenGL context
   864  //		// into thread-local storage.
   865  //
   866  //		glctx, worker := gl.NewContext()
   867  //		workAvailable := worker.WorkAvailable()
   868  //		go userAppCode(glctx)
   869  //		for {
   870  //			select {
   871  //			case <-workAvailable:
   872  //				worker.DoWork()
   873  //			case <-drawEvent:
   874  //				// ... platform-specific cgo call to draw screen
   875  //			}
   876  //		}
   877  //	}()
   878  //
   879  // This interface is an internal implementation detail and should only be used
   880  // by the package responsible for managing the screen, such as
   881  // golang.org/x/mobile/app.
   882  type Worker interface {
   883  	// WorkAvailable returns a channel that communicates when DoWork should be
   884  	// called.
   885  	WorkAvailable() <-chan struct{}
   886  
   887  	// DoWork performs any pending OpenGL calls.
   888  	DoWork()
   889  }