github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/mobile/gl/work_windows.go (about)

     1  // Copyright 2015 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  import (
     8  	"syscall"
     9  	"unsafe"
    10  )
    11  
    12  // context is described in work.go.
    13  type context struct {
    14  	debug         int32
    15  	workAvailable chan struct{}
    16  	work          chan call
    17  	retvalue      chan uintptr
    18  
    19  	// TODO(crawshaw): will not work with a moving collector
    20  	cStringCounter int
    21  	cStrings       map[int]unsafe.Pointer
    22  }
    23  
    24  func (ctx *context) WorkAvailable() <-chan struct{} { return ctx.workAvailable }
    25  
    26  func NewContext() (Context, Worker) {
    27  	if err := findDLLs(); err != nil {
    28  		panic(err)
    29  	}
    30  	glctx := &context{
    31  		workAvailable: make(chan struct{}, 1),
    32  		work:          make(chan call, 3),
    33  		retvalue:      make(chan uintptr),
    34  		cStrings:      make(map[int]unsafe.Pointer),
    35  	}
    36  	return glctx, glctx
    37  }
    38  
    39  func (ctx *context) enqueue(c call) uintptr {
    40  	ctx.work <- c
    41  
    42  	select {
    43  	case ctx.workAvailable <- struct{}{}:
    44  	default:
    45  	}
    46  
    47  	if c.blocking {
    48  		return <-ctx.retvalue
    49  	}
    50  	return 0
    51  }
    52  
    53  func (ctx *context) DoWork() {
    54  	// TODO: add a work queue
    55  	for {
    56  		select {
    57  		case w := <-ctx.work:
    58  			ret := ctx.doWork(w)
    59  			if w.blocking {
    60  				ctx.retvalue <- ret
    61  			}
    62  		default:
    63  			return
    64  		}
    65  	}
    66  }
    67  
    68  func (ctx *context) cString(s string) (uintptr, func()) {
    69  	buf := make([]byte, len(s)+1)
    70  	for i := 0; i < len(s); i++ {
    71  		buf[i] = s[i]
    72  	}
    73  	ret := unsafe.Pointer(&buf[0])
    74  	id := ctx.cStringCounter
    75  	ctx.cStringCounter++
    76  	ctx.cStrings[id] = ret
    77  	return uintptr(ret), func() { delete(ctx.cStrings, id) }
    78  }
    79  
    80  func (ctx *context) cStringPtr(str string) (uintptr, func()) {
    81  	s, sfree := ctx.cString(str)
    82  	sptr := [2]uintptr{s, 0}
    83  	ret := unsafe.Pointer(&sptr[0])
    84  	id := ctx.cStringCounter
    85  	ctx.cStringCounter++
    86  	ctx.cStrings[id] = ret
    87  	return uintptr(ret), func() { sfree(); delete(ctx.cStrings, id) }
    88  }
    89  
    90  // fixFloat copies the first four arguments into the XMM registers.
    91  // This is for the windows/amd64 calling convention, that wants
    92  // floating point arguments to be passed in XMM.
    93  //
    94  // Mercifully, type information is not required to implement
    95  // this calling convention. In particular see the mixed int/float
    96  // examples:
    97  //
    98  //	https://msdn.microsoft.com/en-us/library/zthk2dkh.aspx
    99  //
   100  // This means it could be fixed in syscall.Syscall. The relevant
   101  // issue is
   102  //
   103  //	https://golang.org/issue/6510
   104  func fixFloat(x0, x1, x2, x3 uintptr)
   105  
   106  func (ctx *context) doWork(c call) (ret uintptr) {
   107  	fixFloat(c.args.a0, c.args.a1, c.args.a2, c.args.a3)
   108  
   109  	switch c.args.fn {
   110  	case glfnActiveTexture:
   111  		syscall.Syscall(glActiveTexture.Addr(), 1, c.args.a0, 0, 0)
   112  	case glfnAttachShader:
   113  		syscall.Syscall(glAttachShader.Addr(), 2, c.args.a0, c.args.a1, 0)
   114  	case glfnBindAttribLocation:
   115  		syscall.Syscall(glBindAttribLocation.Addr(), 3, c.args.a0, c.args.a1, c.args.a2)
   116  	case glfnBindBuffer:
   117  		syscall.Syscall(glBindBuffer.Addr(), 2, c.args.a0, c.args.a1, 0)
   118  	case glfnBindFramebuffer:
   119  		syscall.Syscall(glBindFramebuffer.Addr(), 2, c.args.a0, c.args.a1, 0)
   120  	case glfnBindRenderbuffer:
   121  		syscall.Syscall(glBindRenderbuffer.Addr(), 2, c.args.a0, c.args.a1, 0)
   122  	case glfnBindTexture:
   123  		syscall.Syscall(glBindTexture.Addr(), 2, c.args.a0, c.args.a1, 0)
   124  	case glfnBlendColor:
   125  		syscall.Syscall6(glBlendColor.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
   126  	case glfnBlendEquation:
   127  		syscall.Syscall(glBlendEquation.Addr(), 1, c.args.a0, 0, 0)
   128  	case glfnBlendEquationSeparate:
   129  		syscall.Syscall(glBlendEquationSeparate.Addr(), 2, c.args.a0, c.args.a1, 0)
   130  	case glfnBlendFunc:
   131  		syscall.Syscall(glBlendFunc.Addr(), 2, c.args.a0, c.args.a1, 0)
   132  	case glfnBlendFuncSeparate:
   133  		syscall.Syscall6(glBlendFuncSeparate.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
   134  	case glfnBufferData:
   135  		syscall.Syscall6(glBufferData.Addr(), 4, c.args.a0, c.args.a1, uintptr(c.parg), c.args.a2, 0, 0)
   136  	case glfnBufferSubData:
   137  		syscall.Syscall6(glBufferSubData.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, uintptr(c.parg), 0, 0)
   138  	case glfnCheckFramebufferStatus:
   139  		ret, _, _ = syscall.Syscall(glCheckFramebufferStatus.Addr(), 1, c.args.a0, 0, 0)
   140  	case glfnClear:
   141  		syscall.Syscall(glClear.Addr(), 1, c.args.a0, 0, 0)
   142  	case glfnClearColor:
   143  		syscall.Syscall6(glClearColor.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
   144  	case glfnClearDepthf:
   145  		syscall.Syscall6(glClearDepthf.Addr(), 1, c.args.a0, 0, 0, 0, 0, 0)
   146  	case glfnClearStencil:
   147  		syscall.Syscall(glClearStencil.Addr(), 1, c.args.a0, 0, 0)
   148  	case glfnColorMask:
   149  		syscall.Syscall6(glColorMask.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
   150  	case glfnCompileShader:
   151  		syscall.Syscall(glCompileShader.Addr(), 1, c.args.a0, 0, 0)
   152  	case glfnCompressedTexImage2D:
   153  		syscall.Syscall9(glCompressedTexImage2D.Addr(), 8, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5, c.args.a6, uintptr(c.parg), 0)
   154  	case glfnCompressedTexSubImage2D:
   155  		syscall.Syscall9(glCompressedTexSubImage2D.Addr(), 9, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5, c.args.a6, c.args.a7, uintptr(c.parg))
   156  	case glfnCopyTexImage2D:
   157  		syscall.Syscall9(glCopyTexImage2D.Addr(), 8, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5, c.args.a6, c.args.a7, 0)
   158  	case glfnCopyTexSubImage2D:
   159  		syscall.Syscall9(glCopyTexSubImage2D.Addr(), 8, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5, c.args.a6, c.args.a7, 0)
   160  	case glfnCreateProgram:
   161  		ret, _, _ = syscall.Syscall(glCreateProgram.Addr(), 0, 0, 0, 0)
   162  	case glfnCreateShader:
   163  		ret, _, _ = syscall.Syscall(glCreateShader.Addr(), 1, c.args.a0, 0, 0)
   164  	case glfnCullFace:
   165  		syscall.Syscall(glCullFace.Addr(), 1, c.args.a0, 0, 0)
   166  	case glfnDeleteBuffer:
   167  		syscall.Syscall(glDeleteBuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&c.args.a0)), 0)
   168  	case glfnDeleteFramebuffer:
   169  		syscall.Syscall(glDeleteFramebuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&c.args.a0)), 0)
   170  	case glfnDeleteProgram:
   171  		syscall.Syscall(glDeleteProgram.Addr(), 1, c.args.a0, 0, 0)
   172  	case glfnDeleteRenderbuffer:
   173  		syscall.Syscall(glDeleteRenderbuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&c.args.a0)), 0)
   174  	case glfnDeleteShader:
   175  		syscall.Syscall(glDeleteShader.Addr(), 1, c.args.a0, 0, 0)
   176  	case glfnDeleteTexture:
   177  		syscall.Syscall(glDeleteTextures.Addr(), 2, 1, uintptr(unsafe.Pointer(&c.args.a0)), 0)
   178  	case glfnDepthFunc:
   179  		syscall.Syscall(glDepthFunc.Addr(), 1, c.args.a0, 0, 0)
   180  	case glfnDepthRangef:
   181  		syscall.Syscall6(glDepthRangef.Addr(), 2, c.args.a0, c.args.a1, 0, 0, 0, 0)
   182  	case glfnDepthMask:
   183  		syscall.Syscall(glDepthMask.Addr(), 1, c.args.a0, 0, 0)
   184  	case glfnDetachShader:
   185  		syscall.Syscall(glDetachShader.Addr(), 2, c.args.a0, c.args.a1, 0)
   186  	case glfnDisable:
   187  		syscall.Syscall(glDisable.Addr(), 1, c.args.a0, 0, 0)
   188  	case glfnDisableVertexAttribArray:
   189  		syscall.Syscall(glDisableVertexAttribArray.Addr(), 1, c.args.a0, 0, 0)
   190  	case glfnDrawArrays:
   191  		syscall.Syscall(glDrawArrays.Addr(), 3, c.args.a0, c.args.a1, c.args.a2)
   192  	case glfnDrawElements:
   193  		syscall.Syscall6(glDrawElements.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
   194  	case glfnEnable:
   195  		syscall.Syscall(glEnable.Addr(), 1, c.args.a0, 0, 0)
   196  	case glfnEnableVertexAttribArray:
   197  		syscall.Syscall(glEnableVertexAttribArray.Addr(), 1, c.args.a0, 0, 0)
   198  	case glfnFinish:
   199  		syscall.Syscall(glFinish.Addr(), 0, 0, 0, 0)
   200  	case glfnFlush:
   201  		syscall.Syscall(glFlush.Addr(), 0, 0, 0, 0)
   202  	case glfnFramebufferRenderbuffer:
   203  		syscall.Syscall6(glFramebufferRenderbuffer.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
   204  	case glfnFramebufferTexture2D:
   205  		syscall.Syscall6(glFramebufferTexture2D.Addr(), 5, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, 0)
   206  	case glfnFrontFace:
   207  		syscall.Syscall(glFrontFace.Addr(), 1, c.args.a0, 0, 0)
   208  	case glfnGenBuffer:
   209  		syscall.Syscall(glGenBuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&ret)), 0)
   210  	case glfnGenFramebuffer:
   211  		syscall.Syscall(glGenFramebuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&ret)), 0)
   212  	case glfnGenRenderbuffer:
   213  		syscall.Syscall(glGenRenderbuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&ret)), 0)
   214  	case glfnGenTexture:
   215  		syscall.Syscall(glGenTextures.Addr(), 2, 1, uintptr(unsafe.Pointer(&ret)), 0)
   216  	case glfnGenerateMipmap:
   217  		syscall.Syscall(glGenerateMipmap.Addr(), 1, c.args.a0, 0, 0)
   218  	case glfnGetActiveAttrib:
   219  		syscall.Syscall9(glGetActiveAttrib.Addr(), 7, c.args.a0, c.args.a1, c.args.a2, 0, uintptr(unsafe.Pointer(&ret)), c.args.a3, uintptr(c.parg), 0, 0)
   220  	case glfnGetActiveUniform:
   221  		syscall.Syscall9(glGetActiveUniform.Addr(), 7, c.args.a0, c.args.a1, c.args.a2, 0, uintptr(unsafe.Pointer(&ret)), c.args.a3, uintptr(c.parg), 0, 0)
   222  	case glfnGetAttachedShaders:
   223  		syscall.Syscall6(glGetAttachedShaders.Addr(), 4, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret)), uintptr(c.parg), 0, 0)
   224  	case glfnGetAttribLocation:
   225  		ret, _, _ = syscall.Syscall(glGetAttribLocation.Addr(), 2, c.args.a0, c.args.a1, 0)
   226  	case glfnGetBooleanv:
   227  		syscall.Syscall(glGetBooleanv.Addr(), 2, c.args.a0, uintptr(c.parg), 0)
   228  	case glfnGetBufferParameteri:
   229  		syscall.Syscall(glGetBufferParameteri.Addr(), 3, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret)))
   230  	case glfnGetError:
   231  		ret, _, _ = syscall.Syscall(glGetError.Addr(), 0, 0, 0, 0)
   232  	case glfnGetFloatv:
   233  		syscall.Syscall(glGetFloatv.Addr(), 2, c.args.a0, uintptr(c.parg), 0)
   234  	case glfnGetFramebufferAttachmentParameteriv:
   235  		syscall.Syscall6(glGetFramebufferAttachmentParameteriv.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, uintptr(unsafe.Pointer(&ret)), 0, 0)
   236  	case glfnGetIntegerv:
   237  		syscall.Syscall(glGetIntegerv.Addr(), 2, c.args.a0, uintptr(c.parg), 0)
   238  	case glfnGetProgramInfoLog:
   239  		syscall.Syscall6(glGetProgramInfoLog.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0)
   240  	case glfnGetProgramiv:
   241  		syscall.Syscall(glGetProgramiv.Addr(), 3, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret)))
   242  	case glfnGetRenderbufferParameteriv:
   243  		syscall.Syscall(glGetRenderbufferParameteriv.Addr(), 3, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret)))
   244  	case glfnGetShaderInfoLog:
   245  		syscall.Syscall6(glGetShaderInfoLog.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0)
   246  	case glfnGetShaderPrecisionFormat:
   247  		// c.parg is a [3]int32. The first [2]int32 of the array is one
   248  		// parameter, the final *int32 is another parameter.
   249  		syscall.Syscall6(glGetShaderPrecisionFormat.Addr(), 4, c.args.a0, c.args.a1, uintptr(c.parg), uintptr(c.parg)+2*unsafe.Sizeof(uintptr(0)), 0, 0)
   250  	case glfnGetShaderSource:
   251  		syscall.Syscall6(glGetShaderSource.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0)
   252  	case glfnGetShaderiv:
   253  		syscall.Syscall(glGetShaderiv.Addr(), 3, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret)))
   254  	case glfnGetString:
   255  		ret, _, _ = syscall.Syscall(glGetString.Addr(), 1, c.args.a0, 0, 0)
   256  	case glfnGetTexParameterfv:
   257  		syscall.Syscall(glGetTexParameterfv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
   258  	case glfnGetTexParameteriv:
   259  		syscall.Syscall(glGetTexParameteriv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
   260  	case glfnGetUniformLocation:
   261  		ret, _, _ = syscall.Syscall(glGetUniformLocation.Addr(), 2, c.args.a0, c.args.a1, 0)
   262  	case glfnGetUniformfv:
   263  		syscall.Syscall(glGetUniformfv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
   264  	case glfnGetUniformiv:
   265  		syscall.Syscall(glGetUniformiv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
   266  	case glfnGetVertexAttribfv:
   267  		syscall.Syscall(glGetVertexAttribfv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
   268  	case glfnGetVertexAttribiv:
   269  		syscall.Syscall(glGetVertexAttribiv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
   270  	case glfnHint:
   271  		syscall.Syscall(glHint.Addr(), 2, c.args.a0, c.args.a1, 0)
   272  	case glfnIsBuffer:
   273  		syscall.Syscall(glIsBuffer.Addr(), 1, c.args.a0, 0, 0)
   274  	case glfnIsEnabled:
   275  		syscall.Syscall(glIsEnabled.Addr(), 1, c.args.a0, 0, 0)
   276  	case glfnIsFramebuffer:
   277  		syscall.Syscall(glIsFramebuffer.Addr(), 1, c.args.a0, 0, 0)
   278  	case glfnIsProgram:
   279  		ret, _, _ = syscall.Syscall(glIsProgram.Addr(), 1, c.args.a0, 0, 0)
   280  	case glfnIsRenderbuffer:
   281  		syscall.Syscall(glIsRenderbuffer.Addr(), 1, c.args.a0, 0, 0)
   282  	case glfnIsShader:
   283  		syscall.Syscall(glIsShader.Addr(), 1, c.args.a0, 0, 0)
   284  	case glfnIsTexture:
   285  		syscall.Syscall(glIsTexture.Addr(), 1, c.args.a0, 0, 0)
   286  	case glfnLineWidth:
   287  		syscall.Syscall(glLineWidth.Addr(), 1, c.args.a0, 0, 0)
   288  	case glfnLinkProgram:
   289  		syscall.Syscall(glLinkProgram.Addr(), 1, c.args.a0, 0, 0)
   290  	case glfnPixelStorei:
   291  		syscall.Syscall(glPixelStorei.Addr(), 2, c.args.a0, c.args.a1, 0)
   292  	case glfnPolygonOffset:
   293  		syscall.Syscall6(glPolygonOffset.Addr(), 2, c.args.a0, c.args.a1, 0, 0, 0, 0)
   294  	case glfnReadPixels:
   295  		syscall.Syscall9(glReadPixels.Addr(), 7, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5, uintptr(c.parg), 0, 0)
   296  	case glfnReleaseShaderCompiler:
   297  		syscall.Syscall(glReleaseShaderCompiler.Addr(), 0, 0, 0, 0)
   298  	case glfnRenderbufferStorage:
   299  		syscall.Syscall6(glRenderbufferStorage.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
   300  	case glfnSampleCoverage:
   301  		syscall.Syscall6(glSampleCoverage.Addr(), 1, c.args.a0, 0, 0, 0, 0, 0)
   302  	case glfnScissor:
   303  		syscall.Syscall6(glScissor.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
   304  	case glfnShaderSource:
   305  		syscall.Syscall6(glShaderSource.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, 0, 0, 0)
   306  	case glfnStencilFunc:
   307  		syscall.Syscall(glStencilFunc.Addr(), 3, c.args.a0, c.args.a1, c.args.a2)
   308  	case glfnStencilFuncSeparate:
   309  		syscall.Syscall6(glStencilFuncSeparate.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
   310  	case glfnStencilMask:
   311  		syscall.Syscall(glStencilMask.Addr(), 1, c.args.a0, 0, 0)
   312  	case glfnStencilMaskSeparate:
   313  		syscall.Syscall(glStencilMaskSeparate.Addr(), 2, c.args.a0, c.args.a1, 0)
   314  	case glfnStencilOp:
   315  		syscall.Syscall(glStencilOp.Addr(), 3, c.args.a0, c.args.a1, c.args.a2)
   316  	case glfnStencilOpSeparate:
   317  		syscall.Syscall6(glStencilOpSeparate.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
   318  	case glfnTexImage2D:
   319  		syscall.Syscall9(glTexImage2D.Addr(), 9, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, 0, c.args.a5, c.args.a6, uintptr(c.parg))
   320  	case glfnTexParameterf:
   321  		syscall.Syscall6(glTexParameterf.Addr(), 3, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
   322  	case glfnTexParameterfv:
   323  		syscall.Syscall(glTexParameterfv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
   324  	case glfnTexParameteri:
   325  		syscall.Syscall(glTexParameteri.Addr(), 3, c.args.a0, c.args.a1, c.args.a2)
   326  	case glfnTexParameteriv:
   327  		syscall.Syscall(glTexParameteriv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
   328  	case glfnTexSubImage2D:
   329  		syscall.Syscall9(glTexSubImage2D.Addr(), 9, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5, c.args.a6, c.args.a7, uintptr(c.parg))
   330  	case glfnUniform1f:
   331  		syscall.Syscall6(glUniform1f.Addr(), 2, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
   332  	case glfnUniform1fv:
   333  		syscall.Syscall(glUniform1fv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
   334  	case glfnUniform1i:
   335  		syscall.Syscall(glUniform1i.Addr(), 2, c.args.a0, c.args.a1, 0)
   336  	case glfnUniform1iv:
   337  		syscall.Syscall(glUniform1iv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
   338  	case glfnUniform2f:
   339  		syscall.Syscall6(glUniform2f.Addr(), 3, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
   340  	case glfnUniform2fv:
   341  		syscall.Syscall(glUniform2fv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
   342  	case glfnUniform2i:
   343  		syscall.Syscall(glUniform2i.Addr(), 3, c.args.a0, c.args.a1, c.args.a2)
   344  	case glfnUniform2iv:
   345  		syscall.Syscall(glUniform2iv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
   346  	case glfnUniform3f:
   347  		syscall.Syscall6(glUniform3f.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
   348  	case glfnUniform3fv:
   349  		syscall.Syscall(glUniform3fv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
   350  	case glfnUniform3i:
   351  		syscall.Syscall6(glUniform3i.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
   352  	case glfnUniform3iv:
   353  		syscall.Syscall(glUniform3iv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
   354  	case glfnUniform4f:
   355  		syscall.Syscall6(glUniform4f.Addr(), 5, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
   356  	case glfnUniform4fv:
   357  		syscall.Syscall(glUniform4fv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
   358  	case glfnUniform4i:
   359  		syscall.Syscall6(glUniform4i.Addr(), 5, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, 0)
   360  	case glfnUniform4iv:
   361  		syscall.Syscall(glUniform4iv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
   362  	case glfnUniformMatrix2fv:
   363  		syscall.Syscall6(glUniformMatrix2fv.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0)
   364  	case glfnUniformMatrix3fv:
   365  		syscall.Syscall6(glUniformMatrix3fv.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0)
   366  	case glfnUniformMatrix4fv:
   367  		syscall.Syscall6(glUniformMatrix4fv.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0)
   368  	case glfnUseProgram:
   369  		syscall.Syscall(glUseProgram.Addr(), 1, c.args.a0, 0, 0)
   370  	case glfnValidateProgram:
   371  		syscall.Syscall(glValidateProgram.Addr(), 1, c.args.a0, 0, 0)
   372  	case glfnVertexAttrib1f:
   373  		syscall.Syscall6(glVertexAttrib1f.Addr(), 2, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
   374  	case glfnVertexAttrib1fv:
   375  		syscall.Syscall(glVertexAttrib1fv.Addr(), 2, c.args.a0, uintptr(c.parg), 0)
   376  	case glfnVertexAttrib2f:
   377  		syscall.Syscall6(glVertexAttrib2f.Addr(), 3, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
   378  	case glfnVertexAttrib2fv:
   379  		syscall.Syscall(glVertexAttrib2fv.Addr(), 2, c.args.a0, uintptr(c.parg), 0)
   380  	case glfnVertexAttrib3f:
   381  		syscall.Syscall6(glVertexAttrib3f.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
   382  	case glfnVertexAttrib3fv:
   383  		syscall.Syscall(glVertexAttrib3fv.Addr(), 2, c.args.a0, uintptr(c.parg), 0)
   384  	case glfnVertexAttrib4f:
   385  		syscall.Syscall6(glVertexAttrib3f.Addr(), 5, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
   386  	case glfnVertexAttrib4fv:
   387  		syscall.Syscall(glVertexAttrib4fv.Addr(), 2, c.args.a0, uintptr(c.parg), 0)
   388  	case glfnVertexAttribPointer:
   389  		syscall.Syscall6(glVertexAttribPointer.Addr(), 6, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
   390  	case glfnViewport:
   391  		syscall.Syscall6(glViewport.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
   392  	default:
   393  		panic("unknown GL function")
   394  	}
   395  
   396  	return ret
   397  }
   398  
   399  // Exported libraries for a Windows GUI driver.
   400  //
   401  // LibEGL is not used directly by the gl package, but is needed by any
   402  // driver hoping to use OpenGL ES.
   403  var (
   404  	LibGLESv2 = syscall.NewLazyDLL("libglesv2.dll")
   405  	LibEGL    = syscall.NewLazyDLL("libegl.dll")
   406  )
   407  
   408  var (
   409  	libGLESv2                             = LibGLESv2
   410  	glActiveTexture                       = libGLESv2.NewProc("glActiveTexture")
   411  	glAttachShader                        = libGLESv2.NewProc("glAttachShader")
   412  	glBindAttribLocation                  = libGLESv2.NewProc("glBindAttribLocation")
   413  	glBindBuffer                          = libGLESv2.NewProc("glBindBuffer")
   414  	glBindFramebuffer                     = libGLESv2.NewProc("glBindFramebuffer")
   415  	glBindRenderbuffer                    = libGLESv2.NewProc("glBindRenderbuffer")
   416  	glBindTexture                         = libGLESv2.NewProc("glBindTexture")
   417  	glBlendColor                          = libGLESv2.NewProc("glBlendColor")
   418  	glBlendEquation                       = libGLESv2.NewProc("glBlendEquation")
   419  	glBlendEquationSeparate               = libGLESv2.NewProc("glBlendEquationSeparate")
   420  	glBlendFunc                           = libGLESv2.NewProc("glBlendFunc")
   421  	glBlendFuncSeparate                   = libGLESv2.NewProc("glBlendFuncSeparate")
   422  	glBufferData                          = libGLESv2.NewProc("glBufferData")
   423  	glBufferSubData                       = libGLESv2.NewProc("glBufferSubData")
   424  	glCheckFramebufferStatus              = libGLESv2.NewProc("glCheckFramebufferStatus")
   425  	glClear                               = libGLESv2.NewProc("glClear")
   426  	glClearColor                          = libGLESv2.NewProc("glClearColor")
   427  	glClearDepthf                         = libGLESv2.NewProc("glClearDepthf")
   428  	glClearStencil                        = libGLESv2.NewProc("glClearStencil")
   429  	glColorMask                           = libGLESv2.NewProc("glColorMask")
   430  	glCompileShader                       = libGLESv2.NewProc("glCompileShader")
   431  	glCompressedTexImage2D                = libGLESv2.NewProc("glCompressedTexImage2D")
   432  	glCompressedTexSubImage2D             = libGLESv2.NewProc("glCompressedTexSubImage2D")
   433  	glCopyTexImage2D                      = libGLESv2.NewProc("glCopyTexImage2D")
   434  	glCopyTexSubImage2D                   = libGLESv2.NewProc("glCopyTexSubImage2D")
   435  	glCreateProgram                       = libGLESv2.NewProc("glCreateProgram")
   436  	glCreateShader                        = libGLESv2.NewProc("glCreateShader")
   437  	glCullFace                            = libGLESv2.NewProc("glCullFace")
   438  	glDeleteBuffers                       = libGLESv2.NewProc("glDeleteBuffers")
   439  	glDeleteFramebuffers                  = libGLESv2.NewProc("glDeleteFramebuffers")
   440  	glDeleteProgram                       = libGLESv2.NewProc("glDeleteProgram")
   441  	glDeleteRenderbuffers                 = libGLESv2.NewProc("glDeleteRenderbuffers")
   442  	glDeleteShader                        = libGLESv2.NewProc("glDeleteShader")
   443  	glDeleteTextures                      = libGLESv2.NewProc("glDeleteTextures")
   444  	glDepthFunc                           = libGLESv2.NewProc("glDepthFunc")
   445  	glDepthRangef                         = libGLESv2.NewProc("glDepthRangef")
   446  	glDepthMask                           = libGLESv2.NewProc("glDepthMask")
   447  	glDetachShader                        = libGLESv2.NewProc("glDetachShader")
   448  	glDisable                             = libGLESv2.NewProc("glDisable")
   449  	glDisableVertexAttribArray            = libGLESv2.NewProc("glDisableVertexAttribArray")
   450  	glDrawArrays                          = libGLESv2.NewProc("glDrawArrays")
   451  	glDrawElements                        = libGLESv2.NewProc("glDrawElements")
   452  	glEnable                              = libGLESv2.NewProc("glEnable")
   453  	glEnableVertexAttribArray             = libGLESv2.NewProc("glEnableVertexAttribArray")
   454  	glFinish                              = libGLESv2.NewProc("glFinish")
   455  	glFlush                               = libGLESv2.NewProc("glFlush")
   456  	glFramebufferRenderbuffer             = libGLESv2.NewProc("glFramebufferRenderbuffer")
   457  	glFramebufferTexture2D                = libGLESv2.NewProc("glFramebufferTexture2D")
   458  	glFrontFace                           = libGLESv2.NewProc("glFrontFace")
   459  	glGenBuffers                          = libGLESv2.NewProc("glGenBuffers")
   460  	glGenFramebuffers                     = libGLESv2.NewProc("glGenFramebuffers")
   461  	glGenRenderbuffers                    = libGLESv2.NewProc("glGenRenderbuffers")
   462  	glGenTextures                         = libGLESv2.NewProc("glGenTextures")
   463  	glGenerateMipmap                      = libGLESv2.NewProc("glGenerateMipmap")
   464  	glGetActiveAttrib                     = libGLESv2.NewProc("glGetActiveAttrib")
   465  	glGetActiveUniform                    = libGLESv2.NewProc("glGetActiveUniform")
   466  	glGetAttachedShaders                  = libGLESv2.NewProc("glGetAttachedShaders")
   467  	glGetAttribLocation                   = libGLESv2.NewProc("glGetAttribLocation")
   468  	glGetBooleanv                         = libGLESv2.NewProc("glGetBooleanv")
   469  	glGetBufferParameteri                 = libGLESv2.NewProc("glGetBufferParameteri")
   470  	glGetError                            = libGLESv2.NewProc("glGetError")
   471  	glGetFloatv                           = libGLESv2.NewProc("glGetFloatv")
   472  	glGetFramebufferAttachmentParameteriv = libGLESv2.NewProc("glGetFramebufferAttachmentParameteriv")
   473  	glGetIntegerv                         = libGLESv2.NewProc("glGetIntegerv")
   474  	glGetProgramInfoLog                   = libGLESv2.NewProc("glGetProgramInfoLog")
   475  	glGetProgramiv                        = libGLESv2.NewProc("glGetProgramiv")
   476  	glGetRenderbufferParameteriv          = libGLESv2.NewProc("glGetRenderbufferParameteriv")
   477  	glGetShaderInfoLog                    = libGLESv2.NewProc("glGetShaderInfoLog")
   478  	glGetShaderPrecisionFormat            = libGLESv2.NewProc("glGetShaderPrecisionFormat")
   479  	glGetShaderSource                     = libGLESv2.NewProc("glGetShaderSource")
   480  	glGetShaderiv                         = libGLESv2.NewProc("glGetShaderiv")
   481  	glGetString                           = libGLESv2.NewProc("glGetString")
   482  	glGetTexParameterfv                   = libGLESv2.NewProc("glGetTexParameterfv")
   483  	glGetTexParameteriv                   = libGLESv2.NewProc("glGetTexParameteriv")
   484  	glGetUniformLocation                  = libGLESv2.NewProc("glGetUniformLocation")
   485  	glGetUniformfv                        = libGLESv2.NewProc("glGetUniformfv")
   486  	glGetUniformiv                        = libGLESv2.NewProc("glGetUniformiv")
   487  	glGetVertexAttribfv                   = libGLESv2.NewProc("glGetVertexAttribfv")
   488  	glGetVertexAttribiv                   = libGLESv2.NewProc("glGetVertexAttribiv")
   489  	glHint                                = libGLESv2.NewProc("glHint")
   490  	glIsBuffer                            = libGLESv2.NewProc("glIsBuffer")
   491  	glIsEnabled                           = libGLESv2.NewProc("glIsEnabled")
   492  	glIsFramebuffer                       = libGLESv2.NewProc("glIsFramebuffer")
   493  	glIsProgram                           = libGLESv2.NewProc("glIsProgram")
   494  	glIsRenderbuffer                      = libGLESv2.NewProc("glIsRenderbuffer")
   495  	glIsShader                            = libGLESv2.NewProc("glIsShader")
   496  	glIsTexture                           = libGLESv2.NewProc("glIsTexture")
   497  	glLineWidth                           = libGLESv2.NewProc("glLineWidth")
   498  	glLinkProgram                         = libGLESv2.NewProc("glLinkProgram")
   499  	glPixelStorei                         = libGLESv2.NewProc("glPixelStorei")
   500  	glPolygonOffset                       = libGLESv2.NewProc("glPolygonOffset")
   501  	glReadPixels                          = libGLESv2.NewProc("glReadPixels")
   502  	glReleaseShaderCompiler               = libGLESv2.NewProc("glReleaseShaderCompiler")
   503  	glRenderbufferStorage                 = libGLESv2.NewProc("glRenderbufferStorage")
   504  	glSampleCoverage                      = libGLESv2.NewProc("glSampleCoverage")
   505  	glScissor                             = libGLESv2.NewProc("glScissor")
   506  	glShaderSource                        = libGLESv2.NewProc("glShaderSource")
   507  	glStencilFunc                         = libGLESv2.NewProc("glStencilFunc")
   508  	glStencilFuncSeparate                 = libGLESv2.NewProc("glStencilFuncSeparate")
   509  	glStencilMask                         = libGLESv2.NewProc("glStencilMask")
   510  	glStencilMaskSeparate                 = libGLESv2.NewProc("glStencilMaskSeparate")
   511  	glStencilOp                           = libGLESv2.NewProc("glStencilOp")
   512  	glStencilOpSeparate                   = libGLESv2.NewProc("glStencilOpSeparate")
   513  	glTexImage2D                          = libGLESv2.NewProc("glTexImage2D")
   514  	glTexParameterf                       = libGLESv2.NewProc("glTexParameterf")
   515  	glTexParameterfv                      = libGLESv2.NewProc("glTexParameterfv")
   516  	glTexParameteri                       = libGLESv2.NewProc("glTexParameteri")
   517  	glTexParameteriv                      = libGLESv2.NewProc("glTexParameteriv")
   518  	glTexSubImage2D                       = libGLESv2.NewProc("glTexSubImage2D")
   519  	glUniform1f                           = libGLESv2.NewProc("glUniform1f")
   520  	glUniform1fv                          = libGLESv2.NewProc("glUniform1fv")
   521  	glUniform1i                           = libGLESv2.NewProc("glUniform1i")
   522  	glUniform1iv                          = libGLESv2.NewProc("glUniform1iv")
   523  	glUniform2f                           = libGLESv2.NewProc("glUniform2f")
   524  	glUniform2fv                          = libGLESv2.NewProc("glUniform2fv")
   525  	glUniform2i                           = libGLESv2.NewProc("glUniform2i")
   526  	glUniform2iv                          = libGLESv2.NewProc("glUniform2iv")
   527  	glUniform3f                           = libGLESv2.NewProc("glUniform3f")
   528  	glUniform3fv                          = libGLESv2.NewProc("glUniform3fv")
   529  	glUniform3i                           = libGLESv2.NewProc("glUniform3i")
   530  	glUniform3iv                          = libGLESv2.NewProc("glUniform3iv")
   531  	glUniform4f                           = libGLESv2.NewProc("glUniform4f")
   532  	glUniform4fv                          = libGLESv2.NewProc("glUniform4fv")
   533  	glUniform4i                           = libGLESv2.NewProc("glUniform4i")
   534  	glUniform4iv                          = libGLESv2.NewProc("glUniform4iv")
   535  	glUniformMatrix2fv                    = libGLESv2.NewProc("glUniformMatrix2fv")
   536  	glUniformMatrix3fv                    = libGLESv2.NewProc("glUniformMatrix3fv")
   537  	glUniformMatrix4fv                    = libGLESv2.NewProc("glUniformMatrix4fv")
   538  	glUseProgram                          = libGLESv2.NewProc("glUseProgram")
   539  	glValidateProgram                     = libGLESv2.NewProc("glValidateProgram")
   540  	glVertexAttrib1f                      = libGLESv2.NewProc("glVertexAttrib1f")
   541  	glVertexAttrib1fv                     = libGLESv2.NewProc("glVertexAttrib1fv")
   542  	glVertexAttrib2f                      = libGLESv2.NewProc("glVertexAttrib2f")
   543  	glVertexAttrib2fv                     = libGLESv2.NewProc("glVertexAttrib2fv")
   544  	glVertexAttrib3f                      = libGLESv2.NewProc("glVertexAttrib3f")
   545  	glVertexAttrib3fv                     = libGLESv2.NewProc("glVertexAttrib3fv")
   546  	glVertexAttrib4f                      = libGLESv2.NewProc("glVertexAttrib4f")
   547  	glVertexAttrib4fv                     = libGLESv2.NewProc("glVertexAttrib4fv")
   548  	glVertexAttribPointer                 = libGLESv2.NewProc("glVertexAttribPointer")
   549  	glViewport                            = libGLESv2.NewProc("glViewport")
   550  )