Adding upstream version 0.0~git20250520.a1d9079+dfsg.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
590ac7ff5f
commit
20149b7f3a
456 changed files with 70406 additions and 0 deletions
657
gl/consts.go
Normal file
657
gl/consts.go
Normal file
|
@ -0,0 +1,657 @@
|
|||
// Copyright 2014 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package gl
|
||||
|
||||
/*
|
||||
Partially generated from the Khronos OpenGL API specification in XML
|
||||
format, which is covered by the license:
|
||||
|
||||
Copyright (c) 2013-2014 The Khronos Group Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and/or associated documentation files (the
|
||||
"Materials"), to deal in the Materials without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
permit persons to whom the Materials are furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Materials.
|
||||
|
||||
THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
|
||||
*/
|
||||
|
||||
const (
|
||||
POINTS = 0x0000
|
||||
LINES = 0x0001
|
||||
LINE_LOOP = 0x0002
|
||||
LINE_STRIP = 0x0003
|
||||
TRIANGLES = 0x0004
|
||||
TRIANGLE_STRIP = 0x0005
|
||||
TRIANGLE_FAN = 0x0006
|
||||
SRC_COLOR = 0x0300
|
||||
ONE_MINUS_SRC_COLOR = 0x0301
|
||||
SRC_ALPHA = 0x0302
|
||||
ONE_MINUS_SRC_ALPHA = 0x0303
|
||||
DST_ALPHA = 0x0304
|
||||
ONE_MINUS_DST_ALPHA = 0x0305
|
||||
DST_COLOR = 0x0306
|
||||
ONE_MINUS_DST_COLOR = 0x0307
|
||||
SRC_ALPHA_SATURATE = 0x0308
|
||||
FUNC_ADD = 0x8006
|
||||
BLEND_EQUATION = 0x8009
|
||||
BLEND_EQUATION_RGB = 0x8009
|
||||
BLEND_EQUATION_ALPHA = 0x883D
|
||||
FUNC_SUBTRACT = 0x800A
|
||||
FUNC_REVERSE_SUBTRACT = 0x800B
|
||||
BLEND_DST_RGB = 0x80C8
|
||||
BLEND_SRC_RGB = 0x80C9
|
||||
BLEND_DST_ALPHA = 0x80CA
|
||||
BLEND_SRC_ALPHA = 0x80CB
|
||||
CONSTANT_COLOR = 0x8001
|
||||
ONE_MINUS_CONSTANT_COLOR = 0x8002
|
||||
CONSTANT_ALPHA = 0x8003
|
||||
ONE_MINUS_CONSTANT_ALPHA = 0x8004
|
||||
BLEND_COLOR = 0x8005
|
||||
ARRAY_BUFFER = 0x8892
|
||||
ELEMENT_ARRAY_BUFFER = 0x8893
|
||||
ARRAY_BUFFER_BINDING = 0x8894
|
||||
ELEMENT_ARRAY_BUFFER_BINDING = 0x8895
|
||||
STREAM_DRAW = 0x88E0
|
||||
STATIC_DRAW = 0x88E4
|
||||
DYNAMIC_DRAW = 0x88E8
|
||||
BUFFER_SIZE = 0x8764
|
||||
BUFFER_USAGE = 0x8765
|
||||
CURRENT_VERTEX_ATTRIB = 0x8626
|
||||
FRONT = 0x0404
|
||||
BACK = 0x0405
|
||||
FRONT_AND_BACK = 0x0408
|
||||
TEXTURE_2D = 0x0DE1
|
||||
CULL_FACE = 0x0B44
|
||||
BLEND = 0x0BE2
|
||||
DITHER = 0x0BD0
|
||||
STENCIL_TEST = 0x0B90
|
||||
DEPTH_TEST = 0x0B71
|
||||
SCISSOR_TEST = 0x0C11
|
||||
POLYGON_OFFSET_FILL = 0x8037
|
||||
SAMPLE_ALPHA_TO_COVERAGE = 0x809E
|
||||
SAMPLE_COVERAGE = 0x80A0
|
||||
INVALID_ENUM = 0x0500
|
||||
INVALID_VALUE = 0x0501
|
||||
INVALID_OPERATION = 0x0502
|
||||
OUT_OF_MEMORY = 0x0505
|
||||
CW = 0x0900
|
||||
CCW = 0x0901
|
||||
LINE_WIDTH = 0x0B21
|
||||
ALIASED_POINT_SIZE_RANGE = 0x846D
|
||||
ALIASED_LINE_WIDTH_RANGE = 0x846E
|
||||
CULL_FACE_MODE = 0x0B45
|
||||
FRONT_FACE = 0x0B46
|
||||
DEPTH_RANGE = 0x0B70
|
||||
DEPTH_WRITEMASK = 0x0B72
|
||||
DEPTH_CLEAR_VALUE = 0x0B73
|
||||
DEPTH_FUNC = 0x0B74
|
||||
STENCIL_CLEAR_VALUE = 0x0B91
|
||||
STENCIL_FUNC = 0x0B92
|
||||
STENCIL_FAIL = 0x0B94
|
||||
STENCIL_PASS_DEPTH_FAIL = 0x0B95
|
||||
STENCIL_PASS_DEPTH_PASS = 0x0B96
|
||||
STENCIL_REF = 0x0B97
|
||||
STENCIL_VALUE_MASK = 0x0B93
|
||||
STENCIL_WRITEMASK = 0x0B98
|
||||
STENCIL_BACK_FUNC = 0x8800
|
||||
STENCIL_BACK_FAIL = 0x8801
|
||||
STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802
|
||||
STENCIL_BACK_PASS_DEPTH_PASS = 0x8803
|
||||
STENCIL_BACK_REF = 0x8CA3
|
||||
STENCIL_BACK_VALUE_MASK = 0x8CA4
|
||||
STENCIL_BACK_WRITEMASK = 0x8CA5
|
||||
VIEWPORT = 0x0BA2
|
||||
SCISSOR_BOX = 0x0C10
|
||||
COLOR_CLEAR_VALUE = 0x0C22
|
||||
COLOR_WRITEMASK = 0x0C23
|
||||
UNPACK_ALIGNMENT = 0x0CF5
|
||||
PACK_ALIGNMENT = 0x0D05
|
||||
MAX_TEXTURE_SIZE = 0x0D33
|
||||
MAX_VIEWPORT_DIMS = 0x0D3A
|
||||
SUBPIXEL_BITS = 0x0D50
|
||||
RED_BITS = 0x0D52
|
||||
GREEN_BITS = 0x0D53
|
||||
BLUE_BITS = 0x0D54
|
||||
ALPHA_BITS = 0x0D55
|
||||
DEPTH_BITS = 0x0D56
|
||||
STENCIL_BITS = 0x0D57
|
||||
POLYGON_OFFSET_UNITS = 0x2A00
|
||||
POLYGON_OFFSET_FACTOR = 0x8038
|
||||
TEXTURE_BINDING_2D = 0x8069
|
||||
SAMPLE_BUFFERS = 0x80A8
|
||||
SAMPLES = 0x80A9
|
||||
SAMPLE_COVERAGE_VALUE = 0x80AA
|
||||
SAMPLE_COVERAGE_INVERT = 0x80AB
|
||||
NUM_COMPRESSED_TEXTURE_FORMATS = 0x86A2
|
||||
COMPRESSED_TEXTURE_FORMATS = 0x86A3
|
||||
DONT_CARE = 0x1100
|
||||
FASTEST = 0x1101
|
||||
NICEST = 0x1102
|
||||
GENERATE_MIPMAP_HINT = 0x8192
|
||||
BYTE = 0x1400
|
||||
UNSIGNED_BYTE = 0x1401
|
||||
SHORT = 0x1402
|
||||
UNSIGNED_SHORT = 0x1403
|
||||
INT = 0x1404
|
||||
UNSIGNED_INT = 0x1405
|
||||
FLOAT = 0x1406
|
||||
FIXED = 0x140C
|
||||
DEPTH_COMPONENT = 0x1902
|
||||
ALPHA = 0x1906
|
||||
RGB = 0x1907
|
||||
RGBA = 0x1908
|
||||
LUMINANCE = 0x1909
|
||||
LUMINANCE_ALPHA = 0x190A
|
||||
UNSIGNED_SHORT_4_4_4_4 = 0x8033
|
||||
UNSIGNED_SHORT_5_5_5_1 = 0x8034
|
||||
UNSIGNED_SHORT_5_6_5 = 0x8363
|
||||
MAX_VERTEX_ATTRIBS = 0x8869
|
||||
MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB
|
||||
MAX_VARYING_VECTORS = 0x8DFC
|
||||
MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D
|
||||
MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C
|
||||
MAX_TEXTURE_IMAGE_UNITS = 0x8872
|
||||
MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD
|
||||
SHADER_TYPE = 0x8B4F
|
||||
DELETE_STATUS = 0x8B80
|
||||
LINK_STATUS = 0x8B82
|
||||
VALIDATE_STATUS = 0x8B83
|
||||
ATTACHED_SHADERS = 0x8B85
|
||||
ACTIVE_UNIFORMS = 0x8B86
|
||||
ACTIVE_UNIFORM_MAX_LENGTH = 0x8B87
|
||||
ACTIVE_ATTRIBUTES = 0x8B89
|
||||
ACTIVE_ATTRIBUTE_MAX_LENGTH = 0x8B8A
|
||||
SHADING_LANGUAGE_VERSION = 0x8B8C
|
||||
CURRENT_PROGRAM = 0x8B8D
|
||||
NEVER = 0x0200
|
||||
LESS = 0x0201
|
||||
EQUAL = 0x0202
|
||||
LEQUAL = 0x0203
|
||||
GREATER = 0x0204
|
||||
NOTEQUAL = 0x0205
|
||||
GEQUAL = 0x0206
|
||||
ALWAYS = 0x0207
|
||||
KEEP = 0x1E00
|
||||
REPLACE = 0x1E01
|
||||
INCR = 0x1E02
|
||||
DECR = 0x1E03
|
||||
INVERT = 0x150A
|
||||
INCR_WRAP = 0x8507
|
||||
DECR_WRAP = 0x8508
|
||||
VENDOR = 0x1F00
|
||||
RENDERER = 0x1F01
|
||||
VERSION = 0x1F02
|
||||
EXTENSIONS = 0x1F03
|
||||
NEAREST = 0x2600
|
||||
LINEAR = 0x2601
|
||||
NEAREST_MIPMAP_NEAREST = 0x2700
|
||||
LINEAR_MIPMAP_NEAREST = 0x2701
|
||||
NEAREST_MIPMAP_LINEAR = 0x2702
|
||||
LINEAR_MIPMAP_LINEAR = 0x2703
|
||||
TEXTURE_MAG_FILTER = 0x2800
|
||||
TEXTURE_MIN_FILTER = 0x2801
|
||||
TEXTURE_WRAP_S = 0x2802
|
||||
TEXTURE_WRAP_T = 0x2803
|
||||
TEXTURE = 0x1702
|
||||
TEXTURE_CUBE_MAP = 0x8513
|
||||
TEXTURE_BINDING_CUBE_MAP = 0x8514
|
||||
TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515
|
||||
TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516
|
||||
TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517
|
||||
TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518
|
||||
TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519
|
||||
TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A
|
||||
MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C
|
||||
TEXTURE0 = 0x84C0
|
||||
TEXTURE1 = 0x84C1
|
||||
TEXTURE2 = 0x84C2
|
||||
TEXTURE3 = 0x84C3
|
||||
TEXTURE4 = 0x84C4
|
||||
TEXTURE5 = 0x84C5
|
||||
TEXTURE6 = 0x84C6
|
||||
TEXTURE7 = 0x84C7
|
||||
TEXTURE8 = 0x84C8
|
||||
TEXTURE9 = 0x84C9
|
||||
TEXTURE10 = 0x84CA
|
||||
TEXTURE11 = 0x84CB
|
||||
TEXTURE12 = 0x84CC
|
||||
TEXTURE13 = 0x84CD
|
||||
TEXTURE14 = 0x84CE
|
||||
TEXTURE15 = 0x84CF
|
||||
TEXTURE16 = 0x84D0
|
||||
TEXTURE17 = 0x84D1
|
||||
TEXTURE18 = 0x84D2
|
||||
TEXTURE19 = 0x84D3
|
||||
TEXTURE20 = 0x84D4
|
||||
TEXTURE21 = 0x84D5
|
||||
TEXTURE22 = 0x84D6
|
||||
TEXTURE23 = 0x84D7
|
||||
TEXTURE24 = 0x84D8
|
||||
TEXTURE25 = 0x84D9
|
||||
TEXTURE26 = 0x84DA
|
||||
TEXTURE27 = 0x84DB
|
||||
TEXTURE28 = 0x84DC
|
||||
TEXTURE29 = 0x84DD
|
||||
TEXTURE30 = 0x84DE
|
||||
TEXTURE31 = 0x84DF
|
||||
ACTIVE_TEXTURE = 0x84E0
|
||||
REPEAT = 0x2901
|
||||
CLAMP_TO_EDGE = 0x812F
|
||||
MIRRORED_REPEAT = 0x8370
|
||||
VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622
|
||||
VERTEX_ATTRIB_ARRAY_SIZE = 0x8623
|
||||
VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624
|
||||
VERTEX_ATTRIB_ARRAY_TYPE = 0x8625
|
||||
VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A
|
||||
VERTEX_ATTRIB_ARRAY_POINTER = 0x8645
|
||||
VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F
|
||||
IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A
|
||||
IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B
|
||||
COMPILE_STATUS = 0x8B81
|
||||
INFO_LOG_LENGTH = 0x8B84
|
||||
SHADER_SOURCE_LENGTH = 0x8B88
|
||||
SHADER_COMPILER = 0x8DFA
|
||||
SHADER_BINARY_FORMATS = 0x8DF8
|
||||
NUM_SHADER_BINARY_FORMATS = 0x8DF9
|
||||
LOW_FLOAT = 0x8DF0
|
||||
MEDIUM_FLOAT = 0x8DF1
|
||||
HIGH_FLOAT = 0x8DF2
|
||||
LOW_INT = 0x8DF3
|
||||
MEDIUM_INT = 0x8DF4
|
||||
HIGH_INT = 0x8DF5
|
||||
FRAMEBUFFER = 0x8D40
|
||||
RENDERBUFFER = 0x8D41
|
||||
RGBA4 = 0x8056
|
||||
RGB5_A1 = 0x8057
|
||||
RGB565 = 0x8D62
|
||||
DEPTH_COMPONENT16 = 0x81A5
|
||||
STENCIL_INDEX8 = 0x8D48
|
||||
RENDERBUFFER_WIDTH = 0x8D42
|
||||
RENDERBUFFER_HEIGHT = 0x8D43
|
||||
RENDERBUFFER_INTERNAL_FORMAT = 0x8D44
|
||||
RENDERBUFFER_RED_SIZE = 0x8D50
|
||||
RENDERBUFFER_GREEN_SIZE = 0x8D51
|
||||
RENDERBUFFER_BLUE_SIZE = 0x8D52
|
||||
RENDERBUFFER_ALPHA_SIZE = 0x8D53
|
||||
RENDERBUFFER_DEPTH_SIZE = 0x8D54
|
||||
RENDERBUFFER_STENCIL_SIZE = 0x8D55
|
||||
FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0
|
||||
FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1
|
||||
FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2
|
||||
FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3
|
||||
COLOR_ATTACHMENT0 = 0x8CE0
|
||||
DEPTH_ATTACHMENT = 0x8D00
|
||||
STENCIL_ATTACHMENT = 0x8D20
|
||||
FRAMEBUFFER_COMPLETE = 0x8CD5
|
||||
FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6
|
||||
FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7
|
||||
FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9
|
||||
FRAMEBUFFER_UNSUPPORTED = 0x8CDD
|
||||
FRAMEBUFFER_BINDING = 0x8CA6
|
||||
RENDERBUFFER_BINDING = 0x8CA7
|
||||
MAX_RENDERBUFFER_SIZE = 0x84E8
|
||||
INVALID_FRAMEBUFFER_OPERATION = 0x0506
|
||||
)
|
||||
|
||||
const (
|
||||
DEPTH_BUFFER_BIT = 0x00000100
|
||||
STENCIL_BUFFER_BIT = 0x00000400
|
||||
COLOR_BUFFER_BIT = 0x00004000
|
||||
)
|
||||
|
||||
const (
|
||||
FLOAT_VEC2 = 0x8B50
|
||||
FLOAT_VEC3 = 0x8B51
|
||||
FLOAT_VEC4 = 0x8B52
|
||||
INT_VEC2 = 0x8B53
|
||||
INT_VEC3 = 0x8B54
|
||||
INT_VEC4 = 0x8B55
|
||||
BOOL = 0x8B56
|
||||
BOOL_VEC2 = 0x8B57
|
||||
BOOL_VEC3 = 0x8B58
|
||||
BOOL_VEC4 = 0x8B59
|
||||
FLOAT_MAT2 = 0x8B5A
|
||||
FLOAT_MAT3 = 0x8B5B
|
||||
FLOAT_MAT4 = 0x8B5C
|
||||
SAMPLER_2D = 0x8B5E
|
||||
SAMPLER_CUBE = 0x8B60
|
||||
)
|
||||
|
||||
const (
|
||||
FRAGMENT_SHADER = 0x8B30
|
||||
VERTEX_SHADER = 0x8B31
|
||||
)
|
||||
|
||||
const (
|
||||
FALSE = 0
|
||||
TRUE = 1
|
||||
ZERO = 0
|
||||
ONE = 1
|
||||
NO_ERROR = 0
|
||||
NONE = 0
|
||||
)
|
||||
|
||||
// GL ES 3.0 constants.
|
||||
const (
|
||||
ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH = 0x8A35
|
||||
ACTIVE_UNIFORM_BLOCKS = 0x8A36
|
||||
ALREADY_SIGNALED = 0x911A
|
||||
ANY_SAMPLES_PASSED = 0x8C2F
|
||||
ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8D6A
|
||||
BLUE = 0x1905
|
||||
BUFFER_ACCESS_FLAGS = 0x911F
|
||||
BUFFER_MAP_LENGTH = 0x9120
|
||||
BUFFER_MAP_OFFSET = 0x9121
|
||||
BUFFER_MAPPED = 0x88BC
|
||||
BUFFER_MAP_POINTER = 0x88BD
|
||||
COLOR = 0x1800
|
||||
COLOR_ATTACHMENT10 = 0x8CEA
|
||||
COLOR_ATTACHMENT1 = 0x8CE1
|
||||
COLOR_ATTACHMENT11 = 0x8CEB
|
||||
COLOR_ATTACHMENT12 = 0x8CEC
|
||||
COLOR_ATTACHMENT13 = 0x8CED
|
||||
COLOR_ATTACHMENT14 = 0x8CEE
|
||||
COLOR_ATTACHMENT15 = 0x8CEF
|
||||
COLOR_ATTACHMENT2 = 0x8CE2
|
||||
COLOR_ATTACHMENT3 = 0x8CE3
|
||||
COLOR_ATTACHMENT4 = 0x8CE4
|
||||
COLOR_ATTACHMENT5 = 0x8CE5
|
||||
COLOR_ATTACHMENT6 = 0x8CE6
|
||||
COLOR_ATTACHMENT7 = 0x8CE7
|
||||
COLOR_ATTACHMENT8 = 0x8CE8
|
||||
COLOR_ATTACHMENT9 = 0x8CE9
|
||||
COMPARE_REF_TO_TEXTURE = 0x884E
|
||||
COMPRESSED_R11_EAC = 0x9270
|
||||
COMPRESSED_RG11_EAC = 0x9272
|
||||
COMPRESSED_RGB8_ETC2 = 0x9274
|
||||
COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276
|
||||
COMPRESSED_RGBA8_ETC2_EAC = 0x9278
|
||||
COMPRESSED_SIGNED_R11_EAC = 0x9271
|
||||
COMPRESSED_SIGNED_RG11_EAC = 0x9273
|
||||
COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279
|
||||
COMPRESSED_SRGB8_ETC2 = 0x9275
|
||||
COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277
|
||||
CONDITION_SATISFIED = 0x911C
|
||||
COPY_READ_BUFFER = 0x8F36
|
||||
COPY_READ_BUFFER_BINDING = 0x8F36
|
||||
COPY_WRITE_BUFFER = 0x8F37
|
||||
COPY_WRITE_BUFFER_BINDING = 0x8F37
|
||||
CURRENT_QUERY = 0x8865
|
||||
DEPTH = 0x1801
|
||||
DEPTH24_STENCIL8 = 0x88F0
|
||||
DEPTH32F_STENCIL8 = 0x8CAD
|
||||
DEPTH_COMPONENT24 = 0x81A6
|
||||
DEPTH_COMPONENT32F = 0x8CAC
|
||||
DEPTH_STENCIL = 0x84F9
|
||||
DEPTH_STENCIL_ATTACHMENT = 0x821A
|
||||
DRAW_BUFFER0 = 0x8825
|
||||
DRAW_BUFFER10 = 0x882F
|
||||
DRAW_BUFFER1 = 0x8826
|
||||
DRAW_BUFFER11 = 0x8830
|
||||
DRAW_BUFFER12 = 0x8831
|
||||
DRAW_BUFFER13 = 0x8832
|
||||
DRAW_BUFFER14 = 0x8833
|
||||
DRAW_BUFFER15 = 0x8834
|
||||
DRAW_BUFFER2 = 0x8827
|
||||
DRAW_BUFFER3 = 0x8828
|
||||
DRAW_BUFFER4 = 0x8829
|
||||
DRAW_BUFFER5 = 0x882A
|
||||
DRAW_BUFFER6 = 0x882B
|
||||
DRAW_BUFFER7 = 0x882C
|
||||
DRAW_BUFFER8 = 0x882D
|
||||
DRAW_BUFFER9 = 0x882E
|
||||
DRAW_FRAMEBUFFER = 0x8CA9
|
||||
DRAW_FRAMEBUFFER_BINDING = 0x8CA6
|
||||
DYNAMIC_COPY = 0x88EA
|
||||
DYNAMIC_READ = 0x88E9
|
||||
FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD
|
||||
FLOAT_MAT2x3 = 0x8B65
|
||||
FLOAT_MAT2x4 = 0x8B66
|
||||
FLOAT_MAT3x2 = 0x8B67
|
||||
FLOAT_MAT3x4 = 0x8B68
|
||||
FLOAT_MAT4x2 = 0x8B69
|
||||
FLOAT_MAT4x3 = 0x8B6A
|
||||
FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8B8B
|
||||
FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215
|
||||
FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214
|
||||
FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210
|
||||
FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211
|
||||
FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216
|
||||
FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213
|
||||
FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212
|
||||
FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217
|
||||
FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4
|
||||
FRAMEBUFFER_DEFAULT = 0x8218
|
||||
FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8D56
|
||||
FRAMEBUFFER_UNDEFINED = 0x8219
|
||||
GREEN = 0x1904
|
||||
HALF_FLOAT = 0x140B
|
||||
INT_2_10_10_10_REV = 0x8D9F
|
||||
INTERLEAVED_ATTRIBS = 0x8C8C
|
||||
INT_SAMPLER_2D = 0x8DCA
|
||||
INT_SAMPLER_2D_ARRAY = 0x8DCF
|
||||
INT_SAMPLER_3D = 0x8DCB
|
||||
INT_SAMPLER_CUBE = 0x8DCC
|
||||
INVALID_INDEX = 0xFFFFFFFF
|
||||
MAJOR_VERSION = 0x821B
|
||||
MAP_FLUSH_EXPLICIT_BIT = 0x0010
|
||||
MAP_INVALIDATE_BUFFER_BIT = 0x0008
|
||||
MAP_INVALIDATE_RANGE_BIT = 0x0004
|
||||
MAP_READ_BIT = 0x0001
|
||||
MAP_UNSYNCHRONIZED_BIT = 0x0020
|
||||
MAP_WRITE_BIT = 0x0002
|
||||
MAX = 0x8008
|
||||
MAX_3D_TEXTURE_SIZE = 0x8073
|
||||
MAX_ARRAY_TEXTURE_LAYERS = 0x88FF
|
||||
MAX_COLOR_ATTACHMENTS = 0x8CDF
|
||||
MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8A33
|
||||
MAX_COMBINED_UNIFORM_BLOCKS = 0x8A2E
|
||||
MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8A31
|
||||
MAX_DRAW_BUFFERS = 0x8824
|
||||
MAX_ELEMENT_INDEX = 0x8D6B
|
||||
MAX_ELEMENTS_INDICES = 0x80E9
|
||||
MAX_ELEMENTS_VERTICES = 0x80E8
|
||||
MAX_FRAGMENT_INPUT_COMPONENTS = 0x9125
|
||||
MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8A2D
|
||||
MAX_FRAGMENT_UNIFORM_COMPONENTS = 0x8B49
|
||||
MAX_PROGRAM_TEXEL_OFFSET = 0x8905
|
||||
MAX_SAMPLES = 0x8D57
|
||||
MAX_SERVER_WAIT_TIMEOUT = 0x9111
|
||||
MAX_TEXTURE_LOD_BIAS = 0x84FD
|
||||
MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8C8A
|
||||
MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 0x8C8B
|
||||
MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 0x8C80
|
||||
MAX_UNIFORM_BLOCK_SIZE = 0x8A30
|
||||
MAX_UNIFORM_BUFFER_BINDINGS = 0x8A2F
|
||||
MAX_VARYING_COMPONENTS = 0x8B4B
|
||||
MAX_VERTEX_OUTPUT_COMPONENTS = 0x9122
|
||||
MAX_VERTEX_UNIFORM_BLOCKS = 0x8A2B
|
||||
MAX_VERTEX_UNIFORM_COMPONENTS = 0x8B4A
|
||||
MIN = 0x8007
|
||||
MINOR_VERSION = 0x821C
|
||||
MIN_PROGRAM_TEXEL_OFFSET = 0x8904
|
||||
NUM_EXTENSIONS = 0x821D
|
||||
NUM_PROGRAM_BINARY_FORMATS = 0x87FE
|
||||
NUM_SAMPLE_COUNTS = 0x9380
|
||||
OBJECT_TYPE = 0x9112
|
||||
PACK_ROW_LENGTH = 0x0D02
|
||||
PACK_SKIP_PIXELS = 0x0D04
|
||||
PACK_SKIP_ROWS = 0x0D03
|
||||
PIXEL_PACK_BUFFER = 0x88EB
|
||||
PIXEL_PACK_BUFFER_BINDING = 0x88ED
|
||||
PIXEL_UNPACK_BUFFER = 0x88EC
|
||||
PIXEL_UNPACK_BUFFER_BINDING = 0x88EF
|
||||
PRIMITIVE_RESTART_FIXED_INDEX = 0x8D69
|
||||
PROGRAM_BINARY_FORMATS = 0x87FF
|
||||
PROGRAM_BINARY_LENGTH = 0x8741
|
||||
PROGRAM_BINARY_RETRIEVABLE_HINT = 0x8257
|
||||
QUERY_RESULT = 0x8866
|
||||
QUERY_RESULT_AVAILABLE = 0x8867
|
||||
R11F_G11F_B10F = 0x8C3A
|
||||
R16F = 0x822D
|
||||
R16I = 0x8233
|
||||
R16UI = 0x8234
|
||||
R32F = 0x822E
|
||||
R32I = 0x8235
|
||||
R32UI = 0x8236
|
||||
R8 = 0x8229
|
||||
R8I = 0x8231
|
||||
R8_SNORM = 0x8F94
|
||||
R8UI = 0x8232
|
||||
RASTERIZER_DISCARD = 0x8C89
|
||||
READ_BUFFER = 0x0C02
|
||||
READ_FRAMEBUFFER = 0x8CA8
|
||||
READ_FRAMEBUFFER_BINDING = 0x8CAA
|
||||
RED = 0x1903
|
||||
RED_INTEGER = 0x8D94
|
||||
RENDERBUFFER_SAMPLES = 0x8CAB
|
||||
RG = 0x8227
|
||||
RG16F = 0x822F
|
||||
RG16I = 0x8239
|
||||
RG16UI = 0x823A
|
||||
RG32F = 0x8230
|
||||
RG32I = 0x823B
|
||||
RG32UI = 0x823C
|
||||
RG8 = 0x822B
|
||||
RG8I = 0x8237
|
||||
RG8_SNORM = 0x8F95
|
||||
RG8UI = 0x8238
|
||||
RGB10_A2 = 0x8059
|
||||
RGB10_A2UI = 0x906F
|
||||
RGB16F = 0x881B
|
||||
RGB16I = 0x8D89
|
||||
RGB16UI = 0x8D77
|
||||
RGB32F = 0x8815
|
||||
RGB32I = 0x8D83
|
||||
RGB32UI = 0x8D71
|
||||
RGB8 = 0x8051
|
||||
RGB8I = 0x8D8F
|
||||
RGB8_SNORM = 0x8F96
|
||||
RGB8UI = 0x8D7D
|
||||
RGB9_E5 = 0x8C3D
|
||||
RGBA16F = 0x881A
|
||||
RGBA16I = 0x8D88
|
||||
RGBA16UI = 0x8D76
|
||||
RGBA32F = 0x8814
|
||||
RGBA32I = 0x8D82
|
||||
RGBA32UI = 0x8D70
|
||||
RGBA8 = 0x8058
|
||||
RGBA8I = 0x8D8E
|
||||
RGBA8_SNORM = 0x8F97
|
||||
RGBA8UI = 0x8D7C
|
||||
RGBA_INTEGER = 0x8D99
|
||||
RGB_INTEGER = 0x8D98
|
||||
RG_INTEGER = 0x8228
|
||||
SAMPLER_2D_ARRAY = 0x8DC1
|
||||
SAMPLER_2D_ARRAY_SHADOW = 0x8DC4
|
||||
SAMPLER_2D_SHADOW = 0x8B62
|
||||
SAMPLER_3D = 0x8B5F
|
||||
SAMPLER_BINDING = 0x8919
|
||||
SAMPLER_CUBE_SHADOW = 0x8DC5
|
||||
SEPARATE_ATTRIBS = 0x8C8D
|
||||
SIGNALED = 0x9119
|
||||
SIGNED_NORMALIZED = 0x8F9C
|
||||
SRGB = 0x8C40
|
||||
SRGB8 = 0x8C41
|
||||
SRGB8_ALPHA8 = 0x8C43
|
||||
STATIC_COPY = 0x88E6
|
||||
STATIC_READ = 0x88E5
|
||||
STENCIL = 0x1802
|
||||
STREAM_COPY = 0x88E2
|
||||
STREAM_READ = 0x88E1
|
||||
SYNC_CONDITION = 0x9113
|
||||
SYNC_FENCE = 0x9116
|
||||
SYNC_FLAGS = 0x9115
|
||||
SYNC_FLUSH_COMMANDS_BIT = 0x00000001
|
||||
SYNC_GPU_COMMANDS_COMPLETE = 0x9117
|
||||
SYNC_STATUS = 0x9114
|
||||
TEXTURE_2D_ARRAY = 0x8C1A
|
||||
TEXTURE_3D = 0x806F
|
||||
TEXTURE_BASE_LEVEL = 0x813C
|
||||
TEXTURE_BINDING_2D_ARRAY = 0x8C1D
|
||||
TEXTURE_BINDING_3D = 0x806A
|
||||
TEXTURE_COMPARE_FUNC = 0x884D
|
||||
TEXTURE_COMPARE_MODE = 0x884C
|
||||
TEXTURE_IMMUTABLE_FORMAT = 0x912F
|
||||
TEXTURE_IMMUTABLE_LEVELS = 0x82DF
|
||||
TEXTURE_MAX_LEVEL = 0x813D
|
||||
TEXTURE_MAX_LOD = 0x813B
|
||||
TEXTURE_MIN_LOD = 0x813A
|
||||
TEXTURE_SWIZZLE_A = 0x8E45
|
||||
TEXTURE_SWIZZLE_B = 0x8E44
|
||||
TEXTURE_SWIZZLE_G = 0x8E43
|
||||
TEXTURE_SWIZZLE_R = 0x8E42
|
||||
TEXTURE_WRAP_R = 0x8072
|
||||
TIMEOUT_EXPIRED = 0x911B
|
||||
TIMEOUT_IGNORED = 0xFFFFFFFFFFFFFFFF
|
||||
TRANSFORM_FEEDBACK = 0x8E22
|
||||
TRANSFORM_FEEDBACK_ACTIVE = 0x8E24
|
||||
TRANSFORM_FEEDBACK_BINDING = 0x8E25
|
||||
TRANSFORM_FEEDBACK_BUFFER = 0x8C8E
|
||||
TRANSFORM_FEEDBACK_BUFFER_BINDING = 0x8C8F
|
||||
TRANSFORM_FEEDBACK_BUFFER_MODE = 0x8C7F
|
||||
TRANSFORM_FEEDBACK_BUFFER_SIZE = 0x8C85
|
||||
TRANSFORM_FEEDBACK_BUFFER_START = 0x8C84
|
||||
TRANSFORM_FEEDBACK_PAUSED = 0x8E23
|
||||
TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8C88
|
||||
TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH = 0x8C76
|
||||
TRANSFORM_FEEDBACK_VARYINGS = 0x8C83
|
||||
UNIFORM_ARRAY_STRIDE = 0x8A3C
|
||||
UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8A43
|
||||
UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8A42
|
||||
UNIFORM_BLOCK_BINDING = 0x8A3F
|
||||
UNIFORM_BLOCK_DATA_SIZE = 0x8A40
|
||||
UNIFORM_BLOCK_INDEX = 0x8A3A
|
||||
UNIFORM_BLOCK_NAME_LENGTH = 0x8A41
|
||||
UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8A46
|
||||
UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8A44
|
||||
UNIFORM_BUFFER = 0x8A11
|
||||
UNIFORM_BUFFER_BINDING = 0x8A28
|
||||
UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8A34
|
||||
UNIFORM_BUFFER_SIZE = 0x8A2A
|
||||
UNIFORM_BUFFER_START = 0x8A29
|
||||
UNIFORM_IS_ROW_MAJOR = 0x8A3E
|
||||
UNIFORM_MATRIX_STRIDE = 0x8A3D
|
||||
UNIFORM_NAME_LENGTH = 0x8A39
|
||||
UNIFORM_OFFSET = 0x8A3B
|
||||
UNIFORM_SIZE = 0x8A38
|
||||
UNIFORM_TYPE = 0x8A37
|
||||
UNPACK_IMAGE_HEIGHT = 0x806E
|
||||
UNPACK_ROW_LENGTH = 0x0CF2
|
||||
UNPACK_SKIP_IMAGES = 0x806D
|
||||
UNPACK_SKIP_PIXELS = 0x0CF4
|
||||
UNPACK_SKIP_ROWS = 0x0CF3
|
||||
UNSIGNALED = 0x9118
|
||||
UNSIGNED_INT_10F_11F_11F_REV = 0x8C3B
|
||||
UNSIGNED_INT_2_10_10_10_REV = 0x8368
|
||||
UNSIGNED_INT_24_8 = 0x84FA
|
||||
UNSIGNED_INT_5_9_9_9_REV = 0x8C3E
|
||||
UNSIGNED_INT_SAMPLER_2D = 0x8DD2
|
||||
UNSIGNED_INT_SAMPLER_2D_ARRAY = 0x8DD7
|
||||
UNSIGNED_INT_SAMPLER_3D = 0x8DD3
|
||||
UNSIGNED_INT_SAMPLER_CUBE = 0x8DD4
|
||||
UNSIGNED_INT_VEC2 = 0x8DC6
|
||||
UNSIGNED_INT_VEC3 = 0x8DC7
|
||||
UNSIGNED_INT_VEC4 = 0x8DC8
|
||||
UNSIGNED_NORMALIZED = 0x8C17
|
||||
VERTEX_ARRAY_BINDING = 0x85B5
|
||||
VERTEX_ATTRIB_ARRAY_DIVISOR = 0x88FE
|
||||
VERTEX_ATTRIB_ARRAY_INTEGER = 0x88FD
|
||||
WAIT_FAILED = 0x911D
|
||||
)
|
242
gl/dll_windows.go
Normal file
242
gl/dll_windows.go
Normal file
|
@ -0,0 +1,242 @@
|
|||
// Copyright 2015 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package gl
|
||||
|
||||
import (
|
||||
"archive/tar"
|
||||
"compress/gzip"
|
||||
"debug/pe"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
)
|
||||
|
||||
var debug = log.New(io.Discard, "gl: ", log.LstdFlags)
|
||||
|
||||
func downloadDLLs() (path string, err error) {
|
||||
url := "https://dl.google.com/go/mobile/angle-bd3f8780b-" + runtime.GOARCH + ".tgz"
|
||||
debug.Printf("downloading %s", url)
|
||||
resp, err := http.Get(url)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("gl: %v", err)
|
||||
}
|
||||
defer func() {
|
||||
err2 := resp.Body.Close()
|
||||
if err == nil && err2 != nil {
|
||||
err = fmt.Errorf("gl: error reading body from %v: %v", url, err2)
|
||||
}
|
||||
}()
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
err := fmt.Errorf("gl: error fetching %v, status: %v", url, resp.Status)
|
||||
return "", err
|
||||
}
|
||||
|
||||
r, err := gzip.NewReader(resp.Body)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("gl: error reading gzip from %v: %v", url, err)
|
||||
}
|
||||
tr := tar.NewReader(r)
|
||||
var bytesGLESv2, bytesEGL, bytesD3DCompiler []byte
|
||||
for {
|
||||
header, err := tr.Next()
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("gl: error reading tar from %v: %v", url, err)
|
||||
}
|
||||
switch header.Name {
|
||||
case "angle-" + runtime.GOARCH + "/libglesv2.dll":
|
||||
bytesGLESv2, err = io.ReadAll(tr)
|
||||
case "angle-" + runtime.GOARCH + "/libegl.dll":
|
||||
bytesEGL, err = io.ReadAll(tr)
|
||||
case "angle-" + runtime.GOARCH + "/d3dcompiler_47.dll":
|
||||
bytesD3DCompiler, err = io.ReadAll(tr)
|
||||
default: // skip
|
||||
}
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("gl: error reading %v from %v: %v", header.Name, url, err)
|
||||
}
|
||||
}
|
||||
if len(bytesGLESv2) == 0 || len(bytesEGL) == 0 || len(bytesD3DCompiler) == 0 {
|
||||
return "", fmt.Errorf("gl: did not find all DLLs in %v", url)
|
||||
}
|
||||
|
||||
writeDLLs := func(path string) error {
|
||||
if err := os.WriteFile(filepath.Join(path, "libglesv2.dll"), bytesGLESv2, 0755); err != nil {
|
||||
return fmt.Errorf("gl: cannot install ANGLE: %v", err)
|
||||
}
|
||||
if err := os.WriteFile(filepath.Join(path, "libegl.dll"), bytesEGL, 0755); err != nil {
|
||||
return fmt.Errorf("gl: cannot install ANGLE: %v", err)
|
||||
}
|
||||
if err := os.WriteFile(filepath.Join(path, "d3dcompiler_47.dll"), bytesD3DCompiler, 0755); err != nil {
|
||||
return fmt.Errorf("gl: cannot install ANGLE: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// First, we attempt to install these DLLs in LOCALAPPDATA/Shiny.
|
||||
//
|
||||
// Traditionally we would use the system32 directory, but it is
|
||||
// no longer writable by normal programs.
|
||||
os.MkdirAll(appdataPath(), 0775)
|
||||
if err := writeDLLs(appdataPath()); err == nil {
|
||||
return appdataPath(), nil
|
||||
}
|
||||
debug.Printf("DLLs could not be written to %s", appdataPath())
|
||||
|
||||
// Second, install in GOPATH/pkg if it exists.
|
||||
gopath := os.Getenv("GOPATH")
|
||||
gopathpkg := filepath.Join(gopath, "pkg")
|
||||
if _, err := os.Stat(gopathpkg); err == nil && gopath != "" {
|
||||
if err := writeDLLs(gopathpkg); err == nil {
|
||||
return gopathpkg, nil
|
||||
}
|
||||
}
|
||||
debug.Printf("DLLs could not be written to GOPATH")
|
||||
|
||||
// Third, pick a temporary directory.
|
||||
tmp := os.TempDir()
|
||||
if err := writeDLLs(tmp); err != nil {
|
||||
return "", fmt.Errorf("gl: unable to install ANGLE DLLs: %v", err)
|
||||
}
|
||||
return tmp, nil
|
||||
}
|
||||
|
||||
func appdataPath() string {
|
||||
return filepath.Join(os.Getenv("LOCALAPPDATA"), "GoGL", runtime.GOARCH)
|
||||
}
|
||||
|
||||
func containsDLLs(dir string) bool {
|
||||
compatible := func(name string) bool {
|
||||
file, err := pe.Open(filepath.Join(dir, name))
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
switch file.Machine {
|
||||
case pe.IMAGE_FILE_MACHINE_AMD64:
|
||||
return "amd64" == runtime.GOARCH
|
||||
case pe.IMAGE_FILE_MACHINE_ARM:
|
||||
return "arm" == runtime.GOARCH
|
||||
case pe.IMAGE_FILE_MACHINE_I386:
|
||||
return "386" == runtime.GOARCH
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
return compatible("libglesv2.dll") && compatible("libegl.dll") && compatible("d3dcompiler_47.dll")
|
||||
}
|
||||
|
||||
func chromePath() string {
|
||||
// dlls are stored in:
|
||||
// <BASE>/<VERSION>/libglesv2.dll
|
||||
|
||||
var installdirs = []string{
|
||||
// Chrome User
|
||||
filepath.Join(os.Getenv("LOCALAPPDATA"), "Google", "Chrome", "Application"),
|
||||
// Chrome System
|
||||
filepath.Join(os.Getenv("ProgramFiles(x86)"), "Google", "Chrome", "Application"),
|
||||
// Chromium
|
||||
filepath.Join(os.Getenv("LOCALAPPDATA"), "Chromium", "Application"),
|
||||
// Chrome Canary
|
||||
filepath.Join(os.Getenv("LOCALAPPDATA"), "Google", "Chrome SxS", "Application"),
|
||||
}
|
||||
|
||||
for _, installdir := range installdirs {
|
||||
versiondirs, err := os.ReadDir(installdir)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
for _, versiondir := range versiondirs {
|
||||
if !versiondir.IsDir() {
|
||||
continue
|
||||
}
|
||||
|
||||
versionpath := filepath.Join(installdir, versiondir.Name())
|
||||
if containsDLLs(versionpath) {
|
||||
return versionpath
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
func findDLLs() (err error) {
|
||||
load := func(path string) (bool, error) {
|
||||
if path != "" {
|
||||
// don't try to start when one of the files is missing
|
||||
if !containsDLLs(path) {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
LibD3DCompiler.Name = filepath.Join(path, filepath.Base(LibD3DCompiler.Name))
|
||||
LibGLESv2.Name = filepath.Join(path, filepath.Base(LibGLESv2.Name))
|
||||
LibEGL.Name = filepath.Join(path, filepath.Base(LibEGL.Name))
|
||||
}
|
||||
|
||||
if err := LibGLESv2.Load(); err == nil {
|
||||
if err := LibEGL.Load(); err != nil {
|
||||
return false, fmt.Errorf("gl: loaded libglesv2 but not libegl: %v", err)
|
||||
}
|
||||
if err := LibD3DCompiler.Load(); err != nil {
|
||||
return false, fmt.Errorf("gl: loaded libglesv2, libegl but not d3dcompiler: %v", err)
|
||||
}
|
||||
if path == "" {
|
||||
debug.Printf("DLLs found")
|
||||
} else {
|
||||
debug.Printf("DLLs found in: %q", path)
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
||||
return false, nil
|
||||
}
|
||||
|
||||
// Look in the system directory.
|
||||
if ok, err := load(""); ok || err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Look in the AppData directory.
|
||||
if ok, err := load(appdataPath()); ok || err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Look for a Chrome installation
|
||||
if dir := chromePath(); dir != "" {
|
||||
if ok, err := load(dir); ok || err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// Look in GOPATH/pkg.
|
||||
if ok, err := load(filepath.Join(os.Getenv("GOPATH"), "pkg")); ok || err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Look in temporary directory.
|
||||
if ok, err := load(os.TempDir()); ok || err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Download the DLL binary.
|
||||
path, err := downloadDLLs()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
debug.Printf("DLLs written to %s", path)
|
||||
if ok, err := load(path); !ok || err != nil {
|
||||
return fmt.Errorf("gl: unable to load ANGLE after installation: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
66
gl/doc.go
Normal file
66
gl/doc.go
Normal file
|
@ -0,0 +1,66 @@
|
|||
// Copyright 2014 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
/*
|
||||
Package gl implements Go bindings for OpenGL ES 2.0 and ES 3.0.
|
||||
|
||||
The GL functions are defined on a Context object that is responsible for
|
||||
tracking a GL context. Typically a windowing system package (such as
|
||||
golang.org/x/exp/shiny/screen) will call NewContext and provide
|
||||
a gl.Context for a user application.
|
||||
|
||||
If the gl package is compiled on a platform capable of supporting ES 3.0,
|
||||
the gl.Context object also implements gl.Context3.
|
||||
|
||||
The bindings are deliberately minimal, staying as close the C API as
|
||||
possible. The semantics of each function maps onto functions
|
||||
described in the Khronos documentation:
|
||||
|
||||
https://www.khronos.org/opengles/sdk/docs/man/
|
||||
|
||||
One notable departure from the C API is the introduction of types
|
||||
to represent common uses of GLint: Texture, Surface, Buffer, etc.
|
||||
|
||||
# Debug Logging
|
||||
|
||||
A tracing version of the OpenGL bindings is behind the `gldebug` build
|
||||
tag. It acts as a simplified version of apitrace. Build your Go binary
|
||||
with
|
||||
|
||||
-tags gldebug
|
||||
|
||||
and each call to a GL function will log its input, output, and any
|
||||
error messages. For example,
|
||||
|
||||
I/GoLog (27668): gl.GenBuffers(1) [Buffer(70001)]
|
||||
I/GoLog (27668): gl.BindBuffer(ARRAY_BUFFER, Buffer(70001))
|
||||
I/GoLog (27668): gl.BufferData(ARRAY_BUFFER, 36, len(36), STATIC_DRAW)
|
||||
I/GoLog (27668): gl.BindBuffer(ARRAY_BUFFER, Buffer(70001))
|
||||
I/GoLog (27668): gl.VertexAttribPointer(Attrib(0), 6, FLOAT, false, 0, 0) error: [INVALID_VALUE]
|
||||
|
||||
The gldebug tracing has very high overhead, so make sure to remove
|
||||
the build tag before deploying any binaries.
|
||||
*/
|
||||
package gl
|
||||
|
||||
/*
|
||||
Implementation details.
|
||||
|
||||
All GL function calls fill out a C.struct_fnargs and drop it on the work
|
||||
queue. The Start function drains the work queue and hands over a batch
|
||||
of calls to C.process which runs them. This allows multiple GL calls to
|
||||
be executed in a single cgo call.
|
||||
|
||||
A GL call is marked as blocking if it returns a value, or if it takes a
|
||||
Go pointer. In this case the call will not return until C.process sends a
|
||||
value on the retvalue channel.
|
||||
|
||||
This implementation ensures any goroutine can make GL calls, but it does
|
||||
not make the GL interface safe for simultaneous use by multiple goroutines.
|
||||
For the purpose of analyzing this code for race conditions, picture two
|
||||
separate goroutines: one blocked on gl.Start, and another making calls to
|
||||
the gl package exported functions.
|
||||
*/
|
||||
|
||||
//go:generate go run gendebug.go -o gldebug.go
|
210
gl/fn.go
Normal file
210
gl/fn.go
Normal file
|
@ -0,0 +1,210 @@
|
|||
// Copyright 2015 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package gl
|
||||
|
||||
import "unsafe"
|
||||
|
||||
type call struct {
|
||||
args fnargs
|
||||
parg unsafe.Pointer
|
||||
blocking bool
|
||||
}
|
||||
|
||||
type fnargs struct {
|
||||
fn glfn
|
||||
|
||||
a0 uintptr
|
||||
a1 uintptr
|
||||
a2 uintptr
|
||||
a3 uintptr
|
||||
a4 uintptr
|
||||
a5 uintptr
|
||||
a6 uintptr
|
||||
a7 uintptr
|
||||
a8 uintptr
|
||||
a9 uintptr
|
||||
}
|
||||
|
||||
type glfn int
|
||||
|
||||
const (
|
||||
glfnUNDEFINED glfn = iota
|
||||
glfnActiveTexture
|
||||
glfnAttachShader
|
||||
glfnBindAttribLocation
|
||||
glfnBindBuffer
|
||||
glfnBindFramebuffer
|
||||
glfnBindRenderbuffer
|
||||
glfnBindTexture
|
||||
glfnBindVertexArray
|
||||
glfnBlendColor
|
||||
glfnBlendEquation
|
||||
glfnBlendEquationSeparate
|
||||
glfnBlendFunc
|
||||
glfnBlendFuncSeparate
|
||||
glfnBufferData
|
||||
glfnBufferSubData
|
||||
glfnCheckFramebufferStatus
|
||||
glfnClear
|
||||
glfnClearColor
|
||||
glfnClearDepthf
|
||||
glfnClearStencil
|
||||
glfnColorMask
|
||||
glfnCompileShader
|
||||
glfnCompressedTexImage2D
|
||||
glfnCompressedTexSubImage2D
|
||||
glfnCopyTexImage2D
|
||||
glfnCopyTexSubImage2D
|
||||
glfnCreateProgram
|
||||
glfnCreateShader
|
||||
glfnCullFace
|
||||
glfnDeleteBuffer
|
||||
glfnDeleteFramebuffer
|
||||
glfnDeleteProgram
|
||||
glfnDeleteRenderbuffer
|
||||
glfnDeleteShader
|
||||
glfnDeleteTexture
|
||||
glfnDeleteVertexArray
|
||||
glfnDepthFunc
|
||||
glfnDepthRangef
|
||||
glfnDepthMask
|
||||
glfnDetachShader
|
||||
glfnDisable
|
||||
glfnDisableVertexAttribArray
|
||||
glfnDrawArrays
|
||||
glfnDrawElements
|
||||
glfnEnable
|
||||
glfnEnableVertexAttribArray
|
||||
glfnFinish
|
||||
glfnFlush
|
||||
glfnFramebufferRenderbuffer
|
||||
glfnFramebufferTexture2D
|
||||
glfnFrontFace
|
||||
glfnGenBuffer
|
||||
glfnGenFramebuffer
|
||||
glfnGenRenderbuffer
|
||||
glfnGenTexture
|
||||
glfnGenVertexArray
|
||||
glfnGenerateMipmap
|
||||
glfnGetActiveAttrib
|
||||
glfnGetActiveUniform
|
||||
glfnGetAttachedShaders
|
||||
glfnGetAttribLocation
|
||||
glfnGetBooleanv
|
||||
glfnGetBufferParameteri
|
||||
glfnGetError
|
||||
glfnGetFloatv
|
||||
glfnGetFramebufferAttachmentParameteriv
|
||||
glfnGetIntegerv
|
||||
glfnGetProgramInfoLog
|
||||
glfnGetProgramiv
|
||||
glfnGetRenderbufferParameteriv
|
||||
glfnGetShaderInfoLog
|
||||
glfnGetShaderPrecisionFormat
|
||||
glfnGetShaderSource
|
||||
glfnGetShaderiv
|
||||
glfnGetString
|
||||
glfnGetTexParameterfv
|
||||
glfnGetTexParameteriv
|
||||
glfnGetUniformLocation
|
||||
glfnGetUniformfv
|
||||
glfnGetUniformiv
|
||||
glfnGetVertexAttribfv
|
||||
glfnGetVertexAttribiv
|
||||
glfnHint
|
||||
glfnIsBuffer
|
||||
glfnIsEnabled
|
||||
glfnIsFramebuffer
|
||||
glfnIsProgram
|
||||
glfnIsRenderbuffer
|
||||
glfnIsShader
|
||||
glfnIsTexture
|
||||
glfnLineWidth
|
||||
glfnLinkProgram
|
||||
glfnPixelStorei
|
||||
glfnPolygonOffset
|
||||
glfnReadPixels
|
||||
glfnReleaseShaderCompiler
|
||||
glfnRenderbufferStorage
|
||||
glfnSampleCoverage
|
||||
glfnScissor
|
||||
glfnShaderSource
|
||||
glfnStencilFunc
|
||||
glfnStencilFuncSeparate
|
||||
glfnStencilMask
|
||||
glfnStencilMaskSeparate
|
||||
glfnStencilOp
|
||||
glfnStencilOpSeparate
|
||||
glfnTexImage2D
|
||||
glfnTexParameterf
|
||||
glfnTexParameterfv
|
||||
glfnTexParameteri
|
||||
glfnTexParameteriv
|
||||
glfnTexSubImage2D
|
||||
glfnUniform1f
|
||||
glfnUniform1fv
|
||||
glfnUniform1i
|
||||
glfnUniform1iv
|
||||
glfnUniform2f
|
||||
glfnUniform2fv
|
||||
glfnUniform2i
|
||||
glfnUniform2iv
|
||||
glfnUniform3f
|
||||
glfnUniform3fv
|
||||
glfnUniform3i
|
||||
glfnUniform3iv
|
||||
glfnUniform4f
|
||||
glfnUniform4fv
|
||||
glfnUniform4i
|
||||
glfnUniform4iv
|
||||
glfnUniformMatrix2fv
|
||||
glfnUniformMatrix3fv
|
||||
glfnUniformMatrix4fv
|
||||
glfnUseProgram
|
||||
glfnValidateProgram
|
||||
glfnVertexAttrib1f
|
||||
glfnVertexAttrib1fv
|
||||
glfnVertexAttrib2f
|
||||
glfnVertexAttrib2fv
|
||||
glfnVertexAttrib3f
|
||||
glfnVertexAttrib3fv
|
||||
glfnVertexAttrib4f
|
||||
glfnVertexAttrib4fv
|
||||
glfnVertexAttribPointer
|
||||
glfnViewport
|
||||
|
||||
// ES 3.0 functions
|
||||
glfnUniformMatrix2x3fv
|
||||
glfnUniformMatrix3x2fv
|
||||
glfnUniformMatrix2x4fv
|
||||
glfnUniformMatrix4x2fv
|
||||
glfnUniformMatrix3x4fv
|
||||
glfnUniformMatrix4x3fv
|
||||
glfnBlitFramebuffer
|
||||
glfnUniform1ui
|
||||
glfnUniform2ui
|
||||
glfnUniform3ui
|
||||
glfnUniform4ui
|
||||
glfnUniform1uiv
|
||||
glfnUniform2uiv
|
||||
glfnUniform3uiv
|
||||
glfnUniform4uiv
|
||||
)
|
||||
|
||||
func goString(buf []byte) string {
|
||||
for i, b := range buf {
|
||||
if b == 0 {
|
||||
return string(buf[:i])
|
||||
}
|
||||
}
|
||||
panic("buf is not NUL-terminated")
|
||||
}
|
||||
|
||||
func glBoolean(b bool) uintptr {
|
||||
if b {
|
||||
return TRUE
|
||||
}
|
||||
return FALSE
|
||||
}
|
994
gl/gendebug.go
Normal file
994
gl/gendebug.go
Normal file
|
@ -0,0 +1,994 @@
|
|||
// Copyright 2014 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build ignore
|
||||
|
||||
// The gendebug program takes gl.go and generates a version of it
|
||||
// where each function includes tracing code that writes its arguments
|
||||
// to the standard log.
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"flag"
|
||||
"fmt"
|
||||
"go/ast"
|
||||
"go/format"
|
||||
"go/parser"
|
||||
"go/printer"
|
||||
"go/token"
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
var enumWhitelist = []string{
|
||||
"POINTS",
|
||||
"LINES",
|
||||
"LINE_LOOP",
|
||||
"LINE_STRIP",
|
||||
"TRIANGLES",
|
||||
"TRIANGLE_STRIP",
|
||||
"TRIANGLE_FAN",
|
||||
"SRC_COLOR",
|
||||
"ONE_MINUS_SRC_COLOR",
|
||||
"SRC_ALPHA",
|
||||
"ONE_MINUS_SRC_ALPHA",
|
||||
"DST_ALPHA",
|
||||
"ONE_MINUS_DST_ALPHA",
|
||||
"DST_COLOR",
|
||||
"ONE_MINUS_DST_COLOR",
|
||||
"SRC_ALPHA_SATURATE",
|
||||
"FUNC_ADD",
|
||||
"BLEND_EQUATION",
|
||||
"BLEND_EQUATION_RGB",
|
||||
"BLEND_EQUATION_ALPHA",
|
||||
"FUNC_SUBTRACT",
|
||||
"FUNC_REVERSE_SUBTRACT",
|
||||
"BLEND_DST_RGB",
|
||||
"BLEND_SRC_RGB",
|
||||
"BLEND_DST_ALPHA",
|
||||
"BLEND_SRC_ALPHA",
|
||||
"CONSTANT_COLOR",
|
||||
"ONE_MINUS_CONSTANT_COLOR",
|
||||
"CONSTANT_ALPHA",
|
||||
"ONE_MINUS_CONSTANT_ALPHA",
|
||||
"BLEND_COLOR",
|
||||
"ARRAY_BUFFER",
|
||||
"ELEMENT_ARRAY_BUFFER",
|
||||
"ARRAY_BUFFER_BINDING",
|
||||
"ELEMENT_ARRAY_BUFFER_BINDING",
|
||||
"STREAM_DRAW",
|
||||
"STATIC_DRAW",
|
||||
"DYNAMIC_DRAW",
|
||||
"BUFFER_SIZE",
|
||||
"BUFFER_USAGE",
|
||||
"CURRENT_VERTEX_ATTRIB",
|
||||
"FRONT",
|
||||
"BACK",
|
||||
"FRONT_AND_BACK",
|
||||
"TEXTURE_2D",
|
||||
"CULL_FACE",
|
||||
"BLEND",
|
||||
"DITHER",
|
||||
"STENCIL_TEST",
|
||||
"DEPTH_TEST",
|
||||
"SCISSOR_TEST",
|
||||
"POLYGON_OFFSET_FILL",
|
||||
"SAMPLE_ALPHA_TO_COVERAGE",
|
||||
"SAMPLE_COVERAGE",
|
||||
"INVALID_ENUM",
|
||||
"INVALID_VALUE",
|
||||
"INVALID_OPERATION",
|
||||
"OUT_OF_MEMORY",
|
||||
"CW",
|
||||
"CCW",
|
||||
"LINE_WIDTH",
|
||||
"ALIASED_POINT_SIZE_RANGE",
|
||||
"ALIASED_LINE_WIDTH_RANGE",
|
||||
"CULL_FACE_MODE",
|
||||
"FRONT_FACE",
|
||||
"DEPTH_RANGE",
|
||||
"DEPTH_WRITEMASK",
|
||||
"DEPTH_CLEAR_VALUE",
|
||||
"DEPTH_FUNC",
|
||||
"STENCIL_CLEAR_VALUE",
|
||||
"STENCIL_FUNC",
|
||||
"STENCIL_FAIL",
|
||||
"STENCIL_PASS_DEPTH_FAIL",
|
||||
"STENCIL_PASS_DEPTH_PASS",
|
||||
"STENCIL_REF",
|
||||
"STENCIL_VALUE_MASK",
|
||||
"STENCIL_WRITEMASK",
|
||||
"STENCIL_BACK_FUNC",
|
||||
"STENCIL_BACK_FAIL",
|
||||
"STENCIL_BACK_PASS_DEPTH_FAIL",
|
||||
"STENCIL_BACK_PASS_DEPTH_PASS",
|
||||
"STENCIL_BACK_REF",
|
||||
"STENCIL_BACK_VALUE_MASK",
|
||||
"STENCIL_BACK_WRITEMASK",
|
||||
"VIEWPORT",
|
||||
"SCISSOR_BOX",
|
||||
"COLOR_CLEAR_VALUE",
|
||||
"COLOR_WRITEMASK",
|
||||
"UNPACK_ALIGNMENT",
|
||||
"PACK_ALIGNMENT",
|
||||
"MAX_TEXTURE_SIZE",
|
||||
"MAX_VIEWPORT_DIMS",
|
||||
"SUBPIXEL_BITS",
|
||||
"RED_BITS",
|
||||
"GREEN_BITS",
|
||||
"BLUE_BITS",
|
||||
"ALPHA_BITS",
|
||||
"DEPTH_BITS",
|
||||
"STENCIL_BITS",
|
||||
"POLYGON_OFFSET_UNITS",
|
||||
"POLYGON_OFFSET_FACTOR",
|
||||
"TEXTURE_BINDING_2D",
|
||||
"SAMPLE_BUFFERS",
|
||||
"SAMPLES",
|
||||
"SAMPLE_COVERAGE_VALUE",
|
||||
"SAMPLE_COVERAGE_INVERT",
|
||||
"NUM_COMPRESSED_TEXTURE_FORMATS",
|
||||
"COMPRESSED_TEXTURE_FORMATS",
|
||||
"DONT_CARE",
|
||||
"FASTEST",
|
||||
"NICEST",
|
||||
"GENERATE_MIPMAP_HINT",
|
||||
"BYTE",
|
||||
"UNSIGNED_BYTE",
|
||||
"SHORT",
|
||||
"UNSIGNED_SHORT",
|
||||
"INT",
|
||||
"UNSIGNED_INT",
|
||||
"FLOAT",
|
||||
"FIXED",
|
||||
"DEPTH_COMPONENT",
|
||||
"ALPHA",
|
||||
"RGB",
|
||||
"RGBA",
|
||||
"LUMINANCE",
|
||||
"LUMINANCE_ALPHA",
|
||||
"UNSIGNED_SHORT_4_4_4_4",
|
||||
"UNSIGNED_SHORT_5_5_5_1",
|
||||
"UNSIGNED_SHORT_5_6_5",
|
||||
"MAX_VERTEX_ATTRIBS",
|
||||
"MAX_VERTEX_UNIFORM_VECTORS",
|
||||
"MAX_VARYING_VECTORS",
|
||||
"MAX_COMBINED_TEXTURE_IMAGE_UNITS",
|
||||
"MAX_VERTEX_TEXTURE_IMAGE_UNITS",
|
||||
"MAX_TEXTURE_IMAGE_UNITS",
|
||||
"MAX_FRAGMENT_UNIFORM_VECTORS",
|
||||
"SHADER_TYPE",
|
||||
"DELETE_STATUS",
|
||||
"LINK_STATUS",
|
||||
"VALIDATE_STATUS",
|
||||
"ATTACHED_SHADERS",
|
||||
"ACTIVE_UNIFORMS",
|
||||
"ACTIVE_UNIFORM_MAX_LENGTH",
|
||||
"ACTIVE_ATTRIBUTES",
|
||||
"ACTIVE_ATTRIBUTE_MAX_LENGTH",
|
||||
"SHADING_LANGUAGE_VERSION",
|
||||
"CURRENT_PROGRAM",
|
||||
"NEVER",
|
||||
"LESS",
|
||||
"EQUAL",
|
||||
"LEQUAL",
|
||||
"GREATER",
|
||||
"NOTEQUAL",
|
||||
"GEQUAL",
|
||||
"ALWAYS",
|
||||
"KEEP",
|
||||
"REPLACE",
|
||||
"INCR",
|
||||
"DECR",
|
||||
"INVERT",
|
||||
"INCR_WRAP",
|
||||
"DECR_WRAP",
|
||||
"VENDOR",
|
||||
"RENDERER",
|
||||
"VERSION",
|
||||
"EXTENSIONS",
|
||||
"NEAREST",
|
||||
"LINEAR",
|
||||
"NEAREST_MIPMAP_NEAREST",
|
||||
"LINEAR_MIPMAP_NEAREST",
|
||||
"NEAREST_MIPMAP_LINEAR",
|
||||
"LINEAR_MIPMAP_LINEAR",
|
||||
"TEXTURE_MAG_FILTER",
|
||||
"TEXTURE_MIN_FILTER",
|
||||
"TEXTURE_WRAP_S",
|
||||
"TEXTURE_WRAP_T",
|
||||
"TEXTURE",
|
||||
"TEXTURE_CUBE_MAP",
|
||||
"TEXTURE_BINDING_CUBE_MAP",
|
||||
"TEXTURE_CUBE_MAP_POSITIVE_X",
|
||||
"TEXTURE_CUBE_MAP_NEGATIVE_X",
|
||||
"TEXTURE_CUBE_MAP_POSITIVE_Y",
|
||||
"TEXTURE_CUBE_MAP_NEGATIVE_Y",
|
||||
"TEXTURE_CUBE_MAP_POSITIVE_Z",
|
||||
"TEXTURE_CUBE_MAP_NEGATIVE_Z",
|
||||
"MAX_CUBE_MAP_TEXTURE_SIZE",
|
||||
"TEXTURE0",
|
||||
"TEXTURE1",
|
||||
"TEXTURE2",
|
||||
"TEXTURE3",
|
||||
"TEXTURE4",
|
||||
"TEXTURE5",
|
||||
"TEXTURE6",
|
||||
"TEXTURE7",
|
||||
"TEXTURE8",
|
||||
"TEXTURE9",
|
||||
"TEXTURE10",
|
||||
"TEXTURE11",
|
||||
"TEXTURE12",
|
||||
"TEXTURE13",
|
||||
"TEXTURE14",
|
||||
"TEXTURE15",
|
||||
"TEXTURE16",
|
||||
"TEXTURE17",
|
||||
"TEXTURE18",
|
||||
"TEXTURE19",
|
||||
"TEXTURE20",
|
||||
"TEXTURE21",
|
||||
"TEXTURE22",
|
||||
"TEXTURE23",
|
||||
"TEXTURE24",
|
||||
"TEXTURE25",
|
||||
"TEXTURE26",
|
||||
"TEXTURE27",
|
||||
"TEXTURE28",
|
||||
"TEXTURE29",
|
||||
"TEXTURE30",
|
||||
"TEXTURE31",
|
||||
"ACTIVE_TEXTURE",
|
||||
"REPEAT",
|
||||
"CLAMP_TO_EDGE",
|
||||
"MIRRORED_REPEAT",
|
||||
"VERTEX_ATTRIB_ARRAY_ENABLED",
|
||||
"VERTEX_ATTRIB_ARRAY_SIZE",
|
||||
"VERTEX_ATTRIB_ARRAY_STRIDE",
|
||||
"VERTEX_ATTRIB_ARRAY_TYPE",
|
||||
"VERTEX_ATTRIB_ARRAY_NORMALIZED",
|
||||
"VERTEX_ATTRIB_ARRAY_POINTER",
|
||||
"VERTEX_ATTRIB_ARRAY_BUFFER_BINDING",
|
||||
"IMPLEMENTATION_COLOR_READ_TYPE",
|
||||
"IMPLEMENTATION_COLOR_READ_FORMAT",
|
||||
"COMPILE_STATUS",
|
||||
"INFO_LOG_LENGTH",
|
||||
"SHADER_SOURCE_LENGTH",
|
||||
"SHADER_COMPILER",
|
||||
"SHADER_BINARY_FORMATS",
|
||||
"NUM_SHADER_BINARY_FORMATS",
|
||||
"LOW_FLOAT",
|
||||
"MEDIUM_FLOAT",
|
||||
"HIGH_FLOAT",
|
||||
"LOW_INT",
|
||||
"MEDIUM_INT",
|
||||
"HIGH_INT",
|
||||
"FRAMEBUFFER",
|
||||
"RENDERBUFFER",
|
||||
"RGBA4",
|
||||
"RGB5_A1",
|
||||
"RGB565",
|
||||
"DEPTH_COMPONENT16",
|
||||
"STENCIL_INDEX8",
|
||||
"RENDERBUFFER_WIDTH",
|
||||
"RENDERBUFFER_HEIGHT",
|
||||
"RENDERBUFFER_INTERNAL_FORMAT",
|
||||
"RENDERBUFFER_RED_SIZE",
|
||||
"RENDERBUFFER_GREEN_SIZE",
|
||||
"RENDERBUFFER_BLUE_SIZE",
|
||||
"RENDERBUFFER_ALPHA_SIZE",
|
||||
"RENDERBUFFER_DEPTH_SIZE",
|
||||
"RENDERBUFFER_STENCIL_SIZE",
|
||||
"FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE",
|
||||
"FRAMEBUFFER_ATTACHMENT_OBJECT_NAME",
|
||||
"FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL",
|
||||
"FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE",
|
||||
"COLOR_ATTACHMENT0",
|
||||
"DEPTH_ATTACHMENT",
|
||||
"STENCIL_ATTACHMENT",
|
||||
"FRAMEBUFFER_COMPLETE",
|
||||
"FRAMEBUFFER_INCOMPLETE_ATTACHMENT",
|
||||
"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT",
|
||||
"FRAMEBUFFER_INCOMPLETE_DIMENSIONS",
|
||||
"FRAMEBUFFER_UNSUPPORTED",
|
||||
"FRAMEBUFFER_BINDING",
|
||||
"RENDERBUFFER_BINDING",
|
||||
"MAX_RENDERBUFFER_SIZE",
|
||||
"INVALID_FRAMEBUFFER_OPERATION",
|
||||
"DEPTH_BUFFER_BIT",
|
||||
"STENCIL_BUFFER_BIT",
|
||||
"COLOR_BUFFER_BIT",
|
||||
"FLOAT_VEC2",
|
||||
"FLOAT_VEC3",
|
||||
"FLOAT_VEC4",
|
||||
"INT_VEC2",
|
||||
"INT_VEC3",
|
||||
"INT_VEC4",
|
||||
"BOOL",
|
||||
"BOOL_VEC2",
|
||||
"BOOL_VEC3",
|
||||
"BOOL_VEC4",
|
||||
"FLOAT_MAT2",
|
||||
"FLOAT_MAT3",
|
||||
"FLOAT_MAT4",
|
||||
"SAMPLER_2D",
|
||||
"SAMPLER_CUBE",
|
||||
"FRAGMENT_SHADER",
|
||||
"VERTEX_SHADER",
|
||||
"FALSE",
|
||||
"TRUE",
|
||||
"ZERO",
|
||||
"ONE",
|
||||
"NO_ERROR",
|
||||
"NONE",
|
||||
"ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH",
|
||||
"ACTIVE_UNIFORM_BLOCKS",
|
||||
"ALREADY_SIGNALED",
|
||||
"ANY_SAMPLES_PASSED",
|
||||
"ANY_SAMPLES_PASSED_CONSERVATIVE",
|
||||
"BLUE",
|
||||
"BUFFER_ACCESS_FLAGS",
|
||||
"BUFFER_MAP_LENGTH",
|
||||
"BUFFER_MAP_OFFSET",
|
||||
"BUFFER_MAPPED",
|
||||
"BUFFER_MAP_POINTER",
|
||||
"COLOR",
|
||||
"COLOR_ATTACHMENT10",
|
||||
"COLOR_ATTACHMENT1",
|
||||
"COLOR_ATTACHMENT11",
|
||||
"COLOR_ATTACHMENT12",
|
||||
"COLOR_ATTACHMENT13",
|
||||
"COLOR_ATTACHMENT14",
|
||||
"COLOR_ATTACHMENT15",
|
||||
"COLOR_ATTACHMENT2",
|
||||
"COLOR_ATTACHMENT3",
|
||||
"COLOR_ATTACHMENT4",
|
||||
"COLOR_ATTACHMENT5",
|
||||
"COLOR_ATTACHMENT6",
|
||||
"COLOR_ATTACHMENT7",
|
||||
"COLOR_ATTACHMENT8",
|
||||
"COLOR_ATTACHMENT9",
|
||||
"COMPARE_REF_TO_TEXTURE",
|
||||
"COMPRESSED_R11_EAC",
|
||||
"COMPRESSED_RG11_EAC",
|
||||
"COMPRESSED_RGB8_ETC2",
|
||||
"COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2",
|
||||
"COMPRESSED_RGBA8_ETC2_EAC",
|
||||
"COMPRESSED_SIGNED_R11_EAC",
|
||||
"COMPRESSED_SIGNED_RG11_EAC",
|
||||
"COMPRESSED_SRGB8_ALPHA8_ETC2_EAC",
|
||||
"COMPRESSED_SRGB8_ETC2",
|
||||
"COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2",
|
||||
"CONDITION_SATISFIED",
|
||||
"COPY_READ_BUFFER",
|
||||
"COPY_READ_BUFFER_BINDING",
|
||||
"COPY_WRITE_BUFFER",
|
||||
"COPY_WRITE_BUFFER_BINDING",
|
||||
"CURRENT_QUERY",
|
||||
"DEPTH",
|
||||
"DEPTH24_STENCIL8",
|
||||
"DEPTH32F_STENCIL8",
|
||||
"DEPTH_COMPONENT24",
|
||||
"DEPTH_COMPONENT32F",
|
||||
"DEPTH_STENCIL",
|
||||
"DEPTH_STENCIL_ATTACHMENT",
|
||||
"DRAW_BUFFER0",
|
||||
"DRAW_BUFFER10",
|
||||
"DRAW_BUFFER1",
|
||||
"DRAW_BUFFER11",
|
||||
"DRAW_BUFFER12",
|
||||
"DRAW_BUFFER13",
|
||||
"DRAW_BUFFER14",
|
||||
"DRAW_BUFFER15",
|
||||
"DRAW_BUFFER2",
|
||||
"DRAW_BUFFER3",
|
||||
"DRAW_BUFFER4",
|
||||
"DRAW_BUFFER5",
|
||||
"DRAW_BUFFER6",
|
||||
"DRAW_BUFFER7",
|
||||
"DRAW_BUFFER8",
|
||||
"DRAW_BUFFER9",
|
||||
"DRAW_FRAMEBUFFER",
|
||||
"DRAW_FRAMEBUFFER_BINDING",
|
||||
"DYNAMIC_COPY",
|
||||
"DYNAMIC_READ",
|
||||
"FLOAT_32_UNSIGNED_INT_24_8_REV",
|
||||
"FLOAT_MAT2x3",
|
||||
"FLOAT_MAT2x4",
|
||||
"FLOAT_MAT3x2",
|
||||
"FLOAT_MAT3x4",
|
||||
"FLOAT_MAT4x2",
|
||||
"FLOAT_MAT4x3",
|
||||
"FRAGMENT_SHADER_DERIVATIVE_HINT",
|
||||
"FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE",
|
||||
"FRAMEBUFFER_ATTACHMENT_BLUE_SIZE",
|
||||
"FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING",
|
||||
"FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE",
|
||||
"FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE",
|
||||
"FRAMEBUFFER_ATTACHMENT_GREEN_SIZE",
|
||||
"FRAMEBUFFER_ATTACHMENT_RED_SIZE",
|
||||
"FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE",
|
||||
"FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER",
|
||||
"FRAMEBUFFER_DEFAULT",
|
||||
"FRAMEBUFFER_INCOMPLETE_MULTISAMPLE",
|
||||
"FRAMEBUFFER_UNDEFINED",
|
||||
"GREEN",
|
||||
"HALF_FLOAT",
|
||||
"INT_2_10_10_10_REV",
|
||||
"INTERLEAVED_ATTRIBS",
|
||||
"INT_SAMPLER_2D",
|
||||
"INT_SAMPLER_2D_ARRAY",
|
||||
"INT_SAMPLER_3D",
|
||||
"INT_SAMPLER_CUBE",
|
||||
"INVALID_INDEX",
|
||||
"MAJOR_VERSION",
|
||||
"MAP_FLUSH_EXPLICIT_BIT",
|
||||
"MAP_INVALIDATE_BUFFER_BIT",
|
||||
"MAP_INVALIDATE_RANGE_BIT",
|
||||
"MAP_READ_BIT",
|
||||
"MAP_UNSYNCHRONIZED_BIT",
|
||||
"MAP_WRITE_BIT",
|
||||
"MAX",
|
||||
"MAX_3D_TEXTURE_SIZE",
|
||||
"MAX_ARRAY_TEXTURE_LAYERS",
|
||||
"MAX_COLOR_ATTACHMENTS",
|
||||
"MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS",
|
||||
"MAX_COMBINED_UNIFORM_BLOCKS",
|
||||
"MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS",
|
||||
"MAX_DRAW_BUFFERS",
|
||||
"MAX_ELEMENT_INDEX",
|
||||
"MAX_ELEMENTS_INDICES",
|
||||
"MAX_ELEMENTS_VERTICES",
|
||||
"MAX_FRAGMENT_INPUT_COMPONENTS",
|
||||
"MAX_FRAGMENT_UNIFORM_BLOCKS",
|
||||
"MAX_FRAGMENT_UNIFORM_COMPONENTS",
|
||||
"MAX_PROGRAM_TEXEL_OFFSET",
|
||||
"MAX_SAMPLES",
|
||||
"MAX_SERVER_WAIT_TIMEOUT",
|
||||
"MAX_TEXTURE_LOD_BIAS",
|
||||
"MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS",
|
||||
"MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS",
|
||||
"MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS",
|
||||
"MAX_UNIFORM_BLOCK_SIZE",
|
||||
"MAX_UNIFORM_BUFFER_BINDINGS",
|
||||
"MAX_VARYING_COMPONENTS",
|
||||
"MAX_VERTEX_OUTPUT_COMPONENTS",
|
||||
"MAX_VERTEX_UNIFORM_BLOCKS",
|
||||
"MAX_VERTEX_UNIFORM_COMPONENTS",
|
||||
"MIN",
|
||||
"MINOR_VERSION",
|
||||
"MIN_PROGRAM_TEXEL_OFFSET",
|
||||
"NUM_EXTENSIONS",
|
||||
"NUM_PROGRAM_BINARY_FORMATS",
|
||||
"NUM_SAMPLE_COUNTS",
|
||||
"OBJECT_TYPE",
|
||||
"PACK_ROW_LENGTH",
|
||||
"PACK_SKIP_PIXELS",
|
||||
"PACK_SKIP_ROWS",
|
||||
"PIXEL_PACK_BUFFER",
|
||||
"PIXEL_PACK_BUFFER_BINDING",
|
||||
"PIXEL_UNPACK_BUFFER",
|
||||
"PIXEL_UNPACK_BUFFER_BINDING",
|
||||
"PRIMITIVE_RESTART_FIXED_INDEX",
|
||||
"PROGRAM_BINARY_FORMATS",
|
||||
"PROGRAM_BINARY_LENGTH",
|
||||
"PROGRAM_BINARY_RETRIEVABLE_HINT",
|
||||
"QUERY_RESULT",
|
||||
"QUERY_RESULT_AVAILABLE",
|
||||
"R11F_G11F_B10F",
|
||||
"R16F",
|
||||
"R16I",
|
||||
"R16UI",
|
||||
"R32F",
|
||||
"R32I",
|
||||
"R32UI",
|
||||
"R8",
|
||||
"R8I",
|
||||
"R8_SNORM",
|
||||
"R8UI",
|
||||
"RASTERIZER_DISCARD",
|
||||
"READ_BUFFER",
|
||||
"READ_FRAMEBUFFER",
|
||||
"READ_FRAMEBUFFER_BINDING",
|
||||
"RED",
|
||||
"RED_INTEGER",
|
||||
"RENDERBUFFER_SAMPLES",
|
||||
"RG",
|
||||
"RG16F",
|
||||
"RG16I",
|
||||
"RG16UI",
|
||||
"RG32F",
|
||||
"RG32I",
|
||||
"RG32UI",
|
||||
"RG8",
|
||||
"RG8I",
|
||||
"RG8_SNORM",
|
||||
"RG8UI",
|
||||
"RGB10_A2",
|
||||
"RGB10_A2UI",
|
||||
"RGB16F",
|
||||
"RGB16I",
|
||||
"RGB16UI",
|
||||
"RGB32F",
|
||||
"RGB32I",
|
||||
"RGB32UI",
|
||||
"RGB8",
|
||||
"RGB8I",
|
||||
"RGB8_SNORM",
|
||||
"RGB8UI",
|
||||
"RGB9_E5",
|
||||
"RGBA16F",
|
||||
"RGBA16I",
|
||||
"RGBA16UI",
|
||||
"RGBA32F",
|
||||
"RGBA32I",
|
||||
"RGBA32UI",
|
||||
"RGBA8",
|
||||
"RGBA8I",
|
||||
"RGBA8_SNORM",
|
||||
"RGBA8UI",
|
||||
"RGBA_INTEGER",
|
||||
"RGB_INTEGER",
|
||||
"RG_INTEGER",
|
||||
"SAMPLER_2D_ARRAY",
|
||||
"SAMPLER_2D_ARRAY_SHADOW",
|
||||
"SAMPLER_2D_SHADOW",
|
||||
"SAMPLER_3D",
|
||||
"SAMPLER_BINDING",
|
||||
"SAMPLER_CUBE_SHADOW",
|
||||
"SEPARATE_ATTRIBS",
|
||||
"SIGNALED",
|
||||
"SIGNED_NORMALIZED",
|
||||
"SRGB",
|
||||
"SRGB8",
|
||||
"SRGB8_ALPHA8",
|
||||
"STATIC_COPY",
|
||||
"STATIC_READ",
|
||||
"STENCIL",
|
||||
"STREAM_COPY",
|
||||
"STREAM_READ",
|
||||
"SYNC_CONDITION",
|
||||
"SYNC_FENCE",
|
||||
"SYNC_FLAGS",
|
||||
"SYNC_FLUSH_COMMANDS_BIT",
|
||||
"SYNC_GPU_COMMANDS_COMPLETE",
|
||||
"SYNC_STATUS",
|
||||
"TEXTURE_2D_ARRAY",
|
||||
"TEXTURE_3D",
|
||||
"TEXTURE_BASE_LEVEL",
|
||||
"TEXTURE_BINDING_2D_ARRAY",
|
||||
"TEXTURE_BINDING_3D",
|
||||
"TEXTURE_COMPARE_FUNC",
|
||||
"TEXTURE_COMPARE_MODE",
|
||||
"TEXTURE_IMMUTABLE_FORMAT",
|
||||
"TEXTURE_IMMUTABLE_LEVELS",
|
||||
"TEXTURE_MAX_LEVEL",
|
||||
"TEXTURE_MAX_LOD",
|
||||
"TEXTURE_MIN_LOD",
|
||||
"TEXTURE_SWIZZLE_A",
|
||||
"TEXTURE_SWIZZLE_B",
|
||||
"TEXTURE_SWIZZLE_G",
|
||||
"TEXTURE_SWIZZLE_R",
|
||||
"TEXTURE_WRAP_R",
|
||||
"TIMEOUT_EXPIRED",
|
||||
"TRANSFORM_FEEDBACK",
|
||||
"TRANSFORM_FEEDBACK_ACTIVE",
|
||||
"TRANSFORM_FEEDBACK_BINDING",
|
||||
"TRANSFORM_FEEDBACK_BUFFER",
|
||||
"TRANSFORM_FEEDBACK_BUFFER_BINDING",
|
||||
"TRANSFORM_FEEDBACK_BUFFER_MODE",
|
||||
"TRANSFORM_FEEDBACK_BUFFER_SIZE",
|
||||
"TRANSFORM_FEEDBACK_BUFFER_START",
|
||||
"TRANSFORM_FEEDBACK_PAUSED",
|
||||
"TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN",
|
||||
"TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH",
|
||||
"TRANSFORM_FEEDBACK_VARYINGS",
|
||||
"UNIFORM_ARRAY_STRIDE",
|
||||
"UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES",
|
||||
"UNIFORM_BLOCK_ACTIVE_UNIFORMS",
|
||||
"UNIFORM_BLOCK_BINDING",
|
||||
"UNIFORM_BLOCK_DATA_SIZE",
|
||||
"UNIFORM_BLOCK_INDEX",
|
||||
"UNIFORM_BLOCK_NAME_LENGTH",
|
||||
"UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER",
|
||||
"UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER",
|
||||
"UNIFORM_BUFFER",
|
||||
"UNIFORM_BUFFER_BINDING",
|
||||
"UNIFORM_BUFFER_OFFSET_ALIGNMENT",
|
||||
"UNIFORM_BUFFER_SIZE",
|
||||
"UNIFORM_BUFFER_START",
|
||||
"UNIFORM_IS_ROW_MAJOR",
|
||||
"UNIFORM_MATRIX_STRIDE",
|
||||
"UNIFORM_NAME_LENGTH",
|
||||
"UNIFORM_OFFSET",
|
||||
"UNIFORM_SIZE",
|
||||
"UNIFORM_TYPE",
|
||||
"UNPACK_IMAGE_HEIGHT",
|
||||
"UNPACK_ROW_LENGTH",
|
||||
"UNPACK_SKIP_IMAGES",
|
||||
"UNPACK_SKIP_PIXELS",
|
||||
"UNPACK_SKIP_ROWS",
|
||||
"UNSIGNALED",
|
||||
"UNSIGNED_INT_10F_11F_11F_REV",
|
||||
"UNSIGNED_INT_2_10_10_10_REV",
|
||||
"UNSIGNED_INT_24_8",
|
||||
"UNSIGNED_INT_5_9_9_9_REV",
|
||||
"UNSIGNED_INT_SAMPLER_2D",
|
||||
"UNSIGNED_INT_SAMPLER_2D_ARRAY",
|
||||
"UNSIGNED_INT_SAMPLER_3D",
|
||||
"UNSIGNED_INT_SAMPLER_CUBE",
|
||||
"UNSIGNED_INT_VEC2",
|
||||
"UNSIGNED_INT_VEC3",
|
||||
"UNSIGNED_INT_VEC4",
|
||||
"UNSIGNED_NORMALIZED",
|
||||
"VERTEX_ARRAY_BINDING",
|
||||
"VERTEX_ATTRIB_ARRAY_DIVISOR",
|
||||
"VERTEX_ATTRIB_ARRAY_INTEGER",
|
||||
"WAIT_FAILED",
|
||||
}
|
||||
|
||||
var outfile = flag.String("o", "", "result will be written to the file instead of stdout.")
|
||||
|
||||
var fset = new(token.FileSet)
|
||||
|
||||
func typeString(t ast.Expr) string {
|
||||
buf := new(bytes.Buffer)
|
||||
printer.Fprint(buf, fset, t)
|
||||
return buf.String()
|
||||
}
|
||||
|
||||
func typePrinter(t string) string {
|
||||
switch t {
|
||||
case "[]float32", "[]byte":
|
||||
return "len(%d)"
|
||||
}
|
||||
return "%v"
|
||||
}
|
||||
|
||||
func typePrinterArg(t, name string) string {
|
||||
switch t {
|
||||
case "[]float32", "[]byte":
|
||||
return "len(" + name + ")"
|
||||
}
|
||||
return name
|
||||
}
|
||||
|
||||
func die(err error) {
|
||||
fmt.Fprintf(os.Stderr, err.Error())
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
|
||||
f, err := parser.ParseFile(fset, "consts.go", nil, parser.ParseComments)
|
||||
if err != nil {
|
||||
die(err)
|
||||
}
|
||||
entries := enum(f)
|
||||
|
||||
f, err = parser.ParseFile(fset, "gl.go", nil, parser.ParseComments)
|
||||
if err != nil {
|
||||
die(err)
|
||||
}
|
||||
|
||||
buf := new(bytes.Buffer)
|
||||
|
||||
fmt.Fprint(buf, preamble)
|
||||
|
||||
fmt.Fprintf(buf, "func (v Enum) String() string {\n")
|
||||
fmt.Fprintf(buf, "\tswitch v {\n")
|
||||
for _, e := range dedup(entries) {
|
||||
fmt.Fprintf(buf, "\tcase 0x%x: return %q\n", e.value, e.name)
|
||||
}
|
||||
fmt.Fprintf(buf, "\t%s\n", `default: return fmt.Sprintf("gl.Enum(0x%x)", uint32(v))`)
|
||||
fmt.Fprintf(buf, "\t}\n")
|
||||
fmt.Fprintf(buf, "}\n\n")
|
||||
|
||||
for _, d := range f.Decls {
|
||||
// Before:
|
||||
// func (ctx *context) StencilMask(mask uint32) {
|
||||
// C.glStencilMask(C.GLuint(mask))
|
||||
// }
|
||||
//
|
||||
// After:
|
||||
// func (ctx *context) StencilMask(mask uint32) {
|
||||
// defer func() {
|
||||
// errstr := ctx.errDrain()
|
||||
// log.Printf("gl.StencilMask(%v) %v", mask, errstr)
|
||||
// }()
|
||||
// C.glStencilMask(C.GLuint(mask))
|
||||
// }
|
||||
fn, ok := d.(*ast.FuncDecl)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
if fn.Recv == nil || fn.Recv.List[0].Names[0].Name != "ctx" {
|
||||
continue
|
||||
}
|
||||
tname := "<unknown>"
|
||||
t := fn.Recv.List[0].Type
|
||||
if star, ok := t.(*ast.StarExpr); ok {
|
||||
tname = "*" + star.X.(*ast.Ident).Name
|
||||
} else if t, ok := t.(*ast.Ident); ok {
|
||||
tname = t.Name
|
||||
}
|
||||
|
||||
var (
|
||||
params []string
|
||||
paramTypes []string
|
||||
results []string
|
||||
resultTypes []string
|
||||
)
|
||||
|
||||
// Print function signature.
|
||||
fmt.Fprintf(buf, "func (ctx %s) %s(", tname, fn.Name.Name)
|
||||
for i, p := range fn.Type.Params.List {
|
||||
if i > 0 {
|
||||
fmt.Fprint(buf, ", ")
|
||||
}
|
||||
ty := typeString(p.Type)
|
||||
for i, n := range p.Names {
|
||||
if i > 0 {
|
||||
fmt.Fprint(buf, ", ")
|
||||
}
|
||||
fmt.Fprintf(buf, "%s ", n.Name)
|
||||
params = append(params, n.Name)
|
||||
paramTypes = append(paramTypes, ty)
|
||||
}
|
||||
fmt.Fprint(buf, ty)
|
||||
}
|
||||
fmt.Fprintf(buf, ") (")
|
||||
if fn.Type.Results != nil {
|
||||
for i, r := range fn.Type.Results.List {
|
||||
if i > 0 {
|
||||
fmt.Fprint(buf, ", ")
|
||||
}
|
||||
ty := typeString(r.Type)
|
||||
if len(r.Names) == 0 {
|
||||
name := fmt.Sprintf("r%d", i)
|
||||
fmt.Fprintf(buf, "%s ", name)
|
||||
results = append(results, name)
|
||||
resultTypes = append(resultTypes, ty)
|
||||
}
|
||||
for i, n := range r.Names {
|
||||
if i > 0 {
|
||||
fmt.Fprint(buf, ", ")
|
||||
}
|
||||
fmt.Fprintf(buf, "%s ", n.Name)
|
||||
results = append(results, n.Name)
|
||||
resultTypes = append(resultTypes, ty)
|
||||
}
|
||||
fmt.Fprint(buf, ty)
|
||||
}
|
||||
}
|
||||
fmt.Fprintf(buf, ") {\n")
|
||||
|
||||
// gl.GetError is used by errDrain, which will be made part of
|
||||
// all functions. So do not apply it to gl.GetError to avoid
|
||||
// infinite recursion.
|
||||
skip := fn.Name.Name == "GetError"
|
||||
|
||||
if !skip {
|
||||
// Insert a defer block for tracing.
|
||||
fmt.Fprintf(buf, "defer func() {\n")
|
||||
fmt.Fprintf(buf, "\terrstr := ctx.errDrain()\n")
|
||||
switch fn.Name.Name {
|
||||
case "GetUniformLocation", "GetAttribLocation":
|
||||
fmt.Fprintf(buf, "\tr0.name = name\n")
|
||||
}
|
||||
fmt.Fprintf(buf, "\tlog.Printf(\"gl.%s(", fn.Name.Name)
|
||||
for i, p := range paramTypes {
|
||||
if i > 0 {
|
||||
fmt.Fprint(buf, ", ")
|
||||
}
|
||||
fmt.Fprint(buf, typePrinter(p))
|
||||
}
|
||||
fmt.Fprintf(buf, ") ")
|
||||
if len(resultTypes) > 1 {
|
||||
fmt.Fprint(buf, "(")
|
||||
}
|
||||
for i, r := range resultTypes {
|
||||
if i > 0 {
|
||||
fmt.Fprint(buf, ", ")
|
||||
}
|
||||
fmt.Fprint(buf, typePrinter(r))
|
||||
}
|
||||
if len(resultTypes) > 1 {
|
||||
fmt.Fprint(buf, ") ")
|
||||
}
|
||||
fmt.Fprintf(buf, "%%v\"")
|
||||
for i, p := range paramTypes {
|
||||
fmt.Fprintf(buf, ", %s", typePrinterArg(p, params[i]))
|
||||
}
|
||||
for i, r := range resultTypes {
|
||||
fmt.Fprintf(buf, ", %s", typePrinterArg(r, results[i]))
|
||||
}
|
||||
fmt.Fprintf(buf, ", errstr)\n")
|
||||
fmt.Fprintf(buf, "}()\n")
|
||||
}
|
||||
|
||||
// Print original body of function.
|
||||
for _, s := range fn.Body.List {
|
||||
if c := enqueueCall(s); c != nil {
|
||||
c.Fun.(*ast.SelectorExpr).Sel.Name = "enqueueDebug"
|
||||
setEnqueueBlocking(c)
|
||||
}
|
||||
printer.Fprint(buf, fset, s)
|
||||
fmt.Fprintf(buf, "\n")
|
||||
}
|
||||
fmt.Fprintf(buf, "}\n\n")
|
||||
}
|
||||
|
||||
b, err := format.Source(buf.Bytes())
|
||||
if err != nil {
|
||||
os.Stdout.Write(buf.Bytes())
|
||||
die(err)
|
||||
}
|
||||
|
||||
if *outfile == "" {
|
||||
os.Stdout.Write(b)
|
||||
return
|
||||
}
|
||||
if err := os.WriteFile(*outfile, b, 0666); err != nil {
|
||||
die(err)
|
||||
}
|
||||
}
|
||||
|
||||
func enqueueCall(stmt ast.Stmt) *ast.CallExpr {
|
||||
exprStmt, ok := stmt.(*ast.ExprStmt)
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
call, ok := exprStmt.X.(*ast.CallExpr)
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
fun, ok := call.Fun.(*ast.SelectorExpr)
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
if fun.Sel.Name != "enqueue" {
|
||||
return nil
|
||||
}
|
||||
return call
|
||||
}
|
||||
|
||||
func setEnqueueBlocking(c *ast.CallExpr) {
|
||||
lit := c.Args[0].(*ast.CompositeLit)
|
||||
for _, elt := range lit.Elts {
|
||||
kv := elt.(*ast.KeyValueExpr)
|
||||
if kv.Key.(*ast.Ident).Name == "blocking" {
|
||||
kv.Value = &ast.Ident{Name: "true"}
|
||||
return
|
||||
}
|
||||
}
|
||||
lit.Elts = append(lit.Elts, &ast.KeyValueExpr{
|
||||
Key: &ast.Ident{
|
||||
NamePos: lit.Rbrace,
|
||||
Name: "blocking",
|
||||
},
|
||||
Value: &ast.Ident{Name: "true"},
|
||||
})
|
||||
}
|
||||
|
||||
const preamble = `// Copyright 2014 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Code generated from gl.go using go generate. DO NOT EDIT.
|
||||
// See doc.go for details.
|
||||
|
||||
//go:build (darwin || linux || openbsd || windows) && gldebug
|
||||
|
||||
package gl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"math"
|
||||
"sync/atomic"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
func (ctx *context) errDrain() string {
|
||||
var errs []Enum
|
||||
for {
|
||||
e := ctx.GetError()
|
||||
if e == 0 {
|
||||
break
|
||||
}
|
||||
errs = append(errs, e)
|
||||
}
|
||||
if len(errs) > 0 {
|
||||
return fmt.Sprintf(" error: %v", errs)
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (ctx *context) enqueueDebug(c call) uintptr {
|
||||
numCalls := atomic.AddInt32(&ctx.debug, 1)
|
||||
if numCalls > 1 {
|
||||
panic("concurrent calls made to the same GL context")
|
||||
}
|
||||
defer func() {
|
||||
if atomic.AddInt32(&ctx.debug, -1) > 0 {
|
||||
select {} // block so you see us in the panic
|
||||
}
|
||||
}()
|
||||
|
||||
return ctx.enqueue(c)
|
||||
}
|
||||
|
||||
`
|
||||
|
||||
type entry struct {
|
||||
name string
|
||||
value uint64
|
||||
}
|
||||
|
||||
func genWhitelistMap(whitelist []string) map[string]bool {
|
||||
m := make(map[string]bool)
|
||||
for _, v := range enumWhitelist {
|
||||
m[v] = true
|
||||
}
|
||||
return m
|
||||
}
|
||||
|
||||
// enum builds a list of all GL constants that make up the gl.Enum type.
|
||||
func enum(f *ast.File) []entry {
|
||||
var entries []entry
|
||||
whitelist := genWhitelistMap(enumWhitelist)
|
||||
for _, d := range f.Decls {
|
||||
gendecl, ok := d.(*ast.GenDecl)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
if gendecl.Tok != token.CONST {
|
||||
continue
|
||||
}
|
||||
for _, s := range gendecl.Specs {
|
||||
v, ok := s.(*ast.ValueSpec)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
if len(v.Names) != 1 || len(v.Values) != 1 {
|
||||
continue
|
||||
}
|
||||
if _, ok := whitelist[v.Names[0].Name]; !ok {
|
||||
continue
|
||||
}
|
||||
val, err := strconv.ParseUint(v.Values[0].(*ast.BasicLit).Value, 0, 64)
|
||||
if err != nil {
|
||||
log.Fatalf("enum %s: %v", v.Names[0].Name, err)
|
||||
}
|
||||
entries = append(entries, entry{v.Names[0].Name, val})
|
||||
}
|
||||
}
|
||||
return entries
|
||||
}
|
||||
|
||||
func dedup(entries []entry) []entry {
|
||||
// Find all duplicates. Use "%d" as the name of any value with duplicates.
|
||||
seen := make(map[uint64]int)
|
||||
for _, e := range entries {
|
||||
seen[e.value]++
|
||||
}
|
||||
var dedup []entry
|
||||
for _, e := range entries {
|
||||
switch seen[e.value] {
|
||||
case 0: // skip, already here
|
||||
case 1:
|
||||
dedup = append(dedup, e)
|
||||
default:
|
||||
// value is duplicated
|
||||
dedup = append(dedup, entry{fmt.Sprintf("%d", e.value), e.value})
|
||||
seen[e.value] = 0
|
||||
}
|
||||
}
|
||||
return dedup
|
||||
}
|
3672
gl/gldebug.go
Normal file
3672
gl/gldebug.go
Normal file
File diff suppressed because it is too large
Load diff
889
gl/interface.go
Normal file
889
gl/interface.go
Normal file
|
@ -0,0 +1,889 @@
|
|||
// Copyright 2014 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package gl
|
||||
|
||||
// Context is an OpenGL ES context.
|
||||
//
|
||||
// A Context has a method for every GL function supported by ES 2 or later.
|
||||
// In a program compiled with ES 3 support, a Context is also a Context3.
|
||||
// For example, a program can:
|
||||
//
|
||||
// func f(glctx gl.Context) {
|
||||
// glctx.(gl.Context3).BlitFramebuffer(...)
|
||||
// }
|
||||
//
|
||||
// Calls are not safe for concurrent use. However calls can be made from
|
||||
// any goroutine, the gl package removes the notion of thread-local
|
||||
// context.
|
||||
//
|
||||
// Contexts are independent. Two contexts can be used concurrently.
|
||||
type Context interface {
|
||||
// ActiveTexture sets the active texture unit.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glActiveTexture.xhtml
|
||||
ActiveTexture(texture Enum)
|
||||
|
||||
// AttachShader attaches a shader to a program.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glAttachShader.xhtml
|
||||
AttachShader(p Program, s Shader)
|
||||
|
||||
// BindAttribLocation binds a vertex attribute index with a named
|
||||
// variable.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glBindAttribLocation.xhtml
|
||||
BindAttribLocation(p Program, a Attrib, name string)
|
||||
|
||||
// BindBuffer binds a buffer.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glBindBuffer.xhtml
|
||||
BindBuffer(target Enum, b Buffer)
|
||||
|
||||
// BindFramebuffer binds a framebuffer.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glBindFramebuffer.xhtml
|
||||
BindFramebuffer(target Enum, fb Framebuffer)
|
||||
|
||||
// BindRenderbuffer binds a render buffer.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glBindRenderbuffer.xhtml
|
||||
BindRenderbuffer(target Enum, rb Renderbuffer)
|
||||
|
||||
// BindTexture binds a texture.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glBindTexture.xhtml
|
||||
BindTexture(target Enum, t Texture)
|
||||
|
||||
// BindVertexArray binds a vertex array.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glBindVertexArray.xhtml
|
||||
BindVertexArray(rb VertexArray)
|
||||
|
||||
// BlendColor sets the blend color.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glBlendColor.xhtml
|
||||
BlendColor(red, green, blue, alpha float32)
|
||||
|
||||
// BlendEquation sets both RGB and alpha blend equations.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glBlendEquation.xhtml
|
||||
BlendEquation(mode Enum)
|
||||
|
||||
// BlendEquationSeparate sets RGB and alpha blend equations separately.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glBlendEquationSeparate.xhtml
|
||||
BlendEquationSeparate(modeRGB, modeAlpha Enum)
|
||||
|
||||
// BlendFunc sets the pixel blending factors.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glBlendFunc.xhtml
|
||||
BlendFunc(sfactor, dfactor Enum)
|
||||
|
||||
// BlendFuncSeparate sets the pixel RGB and alpha blending factors separately.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glBlendFuncSeparate.xhtml
|
||||
BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha Enum)
|
||||
|
||||
// BufferData creates a new data store for the bound buffer object.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glBufferData.xhtml
|
||||
BufferData(target Enum, src []byte, usage Enum)
|
||||
|
||||
// BufferInit creates a new uninitialized data store for the bound buffer object.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glBufferData.xhtml
|
||||
BufferInit(target Enum, size int, usage Enum)
|
||||
|
||||
// BufferSubData sets some of data in the bound buffer object.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glBufferSubData.xhtml
|
||||
BufferSubData(target Enum, offset int, data []byte)
|
||||
|
||||
// CheckFramebufferStatus reports the completeness status of the
|
||||
// active framebuffer.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glCheckFramebufferStatus.xhtml
|
||||
CheckFramebufferStatus(target Enum) Enum
|
||||
|
||||
// Clear clears the window.
|
||||
//
|
||||
// The behavior of Clear is influenced by the pixel ownership test,
|
||||
// the scissor test, dithering, and the buffer writemasks.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glClear.xhtml
|
||||
Clear(mask Enum)
|
||||
|
||||
// ClearColor specifies the RGBA values used to clear color buffers.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glClearColor.xhtml
|
||||
ClearColor(red, green, blue, alpha float32)
|
||||
|
||||
// ClearDepthf sets the depth value used to clear the depth buffer.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glClearDepthf.xhtml
|
||||
ClearDepthf(d float32)
|
||||
|
||||
// ClearStencil sets the index used to clear the stencil buffer.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glClearStencil.xhtml
|
||||
ClearStencil(s int)
|
||||
|
||||
// ColorMask specifies whether color components in the framebuffer
|
||||
// can be written.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glColorMask.xhtml
|
||||
ColorMask(red, green, blue, alpha bool)
|
||||
|
||||
// CompileShader compiles the source code of s.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glCompileShader.xhtml
|
||||
CompileShader(s Shader)
|
||||
|
||||
// CompressedTexImage2D writes a compressed 2D texture.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glCompressedTexImage2D.xhtml
|
||||
CompressedTexImage2D(target Enum, level int, internalformat Enum, width, height, border int, data []byte)
|
||||
|
||||
// CompressedTexSubImage2D writes a subregion of a compressed 2D texture.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glCompressedTexSubImage2D.xhtml
|
||||
CompressedTexSubImage2D(target Enum, level, xoffset, yoffset, width, height int, format Enum, data []byte)
|
||||
|
||||
// CopyTexImage2D writes a 2D texture from the current framebuffer.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glCopyTexImage2D.xhtml
|
||||
CopyTexImage2D(target Enum, level int, internalformat Enum, x, y, width, height, border int)
|
||||
|
||||
// CopyTexSubImage2D writes a 2D texture subregion from the
|
||||
// current framebuffer.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glCopyTexSubImage2D.xhtml
|
||||
CopyTexSubImage2D(target Enum, level, xoffset, yoffset, x, y, width, height int)
|
||||
|
||||
// CreateBuffer creates a buffer object.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGenBuffers.xhtml
|
||||
CreateBuffer() Buffer
|
||||
|
||||
// CreateFramebuffer creates a framebuffer object.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGenFramebuffers.xhtml
|
||||
CreateFramebuffer() Framebuffer
|
||||
|
||||
// CreateProgram creates a new empty program object.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glCreateProgram.xhtml
|
||||
CreateProgram() Program
|
||||
|
||||
// CreateRenderbuffer create a renderbuffer object.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGenRenderbuffers.xhtml
|
||||
CreateRenderbuffer() Renderbuffer
|
||||
|
||||
// CreateShader creates a new empty shader object.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glCreateShader.xhtml
|
||||
CreateShader(ty Enum) Shader
|
||||
|
||||
// CreateTexture creates a texture object.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGenTextures.xhtml
|
||||
CreateTexture() Texture
|
||||
|
||||
// CreateVertexArray creates a vertex array.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGenVertexArrays.xhtml
|
||||
CreateVertexArray() VertexArray
|
||||
|
||||
// CullFace specifies which polygons are candidates for culling.
|
||||
//
|
||||
// Valid modes: FRONT, BACK, FRONT_AND_BACK.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glCullFace.xhtml
|
||||
CullFace(mode Enum)
|
||||
|
||||
// DeleteBuffer deletes the given buffer object.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glDeleteBuffers.xhtml
|
||||
DeleteBuffer(v Buffer)
|
||||
|
||||
// DeleteFramebuffer deletes the given framebuffer object.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glDeleteFramebuffers.xhtml
|
||||
DeleteFramebuffer(v Framebuffer)
|
||||
|
||||
// DeleteProgram deletes the given program object.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glDeleteProgram.xhtml
|
||||
DeleteProgram(p Program)
|
||||
|
||||
// DeleteRenderbuffer deletes the given render buffer object.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glDeleteRenderbuffers.xhtml
|
||||
DeleteRenderbuffer(v Renderbuffer)
|
||||
|
||||
// DeleteShader deletes shader s.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glDeleteShader.xhtml
|
||||
DeleteShader(s Shader)
|
||||
|
||||
// DeleteTexture deletes the given texture object.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glDeleteTextures.xhtml
|
||||
DeleteTexture(v Texture)
|
||||
|
||||
// DeleteVertexArray deletes the given render buffer object.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glDeleteVertexArrays.xhtml
|
||||
DeleteVertexArray(v VertexArray)
|
||||
|
||||
// DepthFunc sets the function used for depth buffer comparisons.
|
||||
//
|
||||
// Valid fn values:
|
||||
// NEVER
|
||||
// LESS
|
||||
// EQUAL
|
||||
// LEQUAL
|
||||
// GREATER
|
||||
// NOTEQUAL
|
||||
// GEQUAL
|
||||
// ALWAYS
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glDepthFunc.xhtml
|
||||
DepthFunc(fn Enum)
|
||||
|
||||
// DepthMask sets the depth buffer enabled for writing.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glDepthMask.xhtml
|
||||
DepthMask(flag bool)
|
||||
|
||||
// DepthRangef sets the mapping from normalized device coordinates to
|
||||
// window coordinates.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glDepthRangef.xhtml
|
||||
DepthRangef(n, f float32)
|
||||
|
||||
// DetachShader detaches the shader s from the program p.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glDetachShader.xhtml
|
||||
DetachShader(p Program, s Shader)
|
||||
|
||||
// Disable disables various GL capabilities.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glDisable.xhtml
|
||||
Disable(cap Enum)
|
||||
|
||||
// DisableVertexAttribArray disables a vertex attribute array.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glDisableVertexAttribArray.xhtml
|
||||
DisableVertexAttribArray(a Attrib)
|
||||
|
||||
// DrawArrays renders geometric primitives from the bound data.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glDrawArrays.xhtml
|
||||
DrawArrays(mode Enum, first, count int)
|
||||
|
||||
// DrawElements renders primitives from a bound buffer.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glDrawElements.xhtml
|
||||
DrawElements(mode Enum, count int, ty Enum, offset int)
|
||||
|
||||
// TODO(crawshaw): consider DrawElements8 / DrawElements16 / DrawElements32
|
||||
|
||||
// Enable enables various GL capabilities.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glEnable.xhtml
|
||||
Enable(cap Enum)
|
||||
|
||||
// EnableVertexAttribArray enables a vertex attribute array.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glEnableVertexAttribArray.xhtml
|
||||
EnableVertexAttribArray(a Attrib)
|
||||
|
||||
// Finish blocks until the effects of all previously called GL
|
||||
// commands are complete.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glFinish.xhtml
|
||||
Finish()
|
||||
|
||||
// Flush empties all buffers. It does not block.
|
||||
//
|
||||
// An OpenGL implementation may buffer network communication,
|
||||
// the command stream, or data inside the graphics accelerator.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glFlush.xhtml
|
||||
Flush()
|
||||
|
||||
// FramebufferRenderbuffer attaches rb to the current frame buffer.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glFramebufferRenderbuffer.xhtml
|
||||
FramebufferRenderbuffer(target, attachment, rbTarget Enum, rb Renderbuffer)
|
||||
|
||||
// FramebufferTexture2D attaches the t to the current frame buffer.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glFramebufferTexture2D.xhtml
|
||||
FramebufferTexture2D(target, attachment, texTarget Enum, t Texture, level int)
|
||||
|
||||
// FrontFace defines which polygons are front-facing.
|
||||
//
|
||||
// Valid modes: CW, CCW.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glFrontFace.xhtml
|
||||
FrontFace(mode Enum)
|
||||
|
||||
// GenerateMipmap generates mipmaps for the current texture.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGenerateMipmap.xhtml
|
||||
GenerateMipmap(target Enum)
|
||||
|
||||
// GetActiveAttrib returns details about an active attribute variable.
|
||||
// A value of 0 for index selects the first active attribute variable.
|
||||
// Permissible values for index range from 0 to the number of active
|
||||
// attribute variables minus 1.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetActiveAttrib.xhtml
|
||||
GetActiveAttrib(p Program, index uint32) (name string, size int, ty Enum)
|
||||
|
||||
// GetActiveUniform returns details about an active uniform variable.
|
||||
// A value of 0 for index selects the first active uniform variable.
|
||||
// Permissible values for index range from 0 to the number of active
|
||||
// uniform variables minus 1.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetActiveUniform.xhtml
|
||||
GetActiveUniform(p Program, index uint32) (name string, size int, ty Enum)
|
||||
|
||||
// GetAttachedShaders returns the shader objects attached to program p.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetAttachedShaders.xhtml
|
||||
GetAttachedShaders(p Program) []Shader
|
||||
|
||||
// GetAttribLocation returns the location of an attribute variable.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetAttribLocation.xhtml
|
||||
GetAttribLocation(p Program, name string) Attrib
|
||||
|
||||
// GetBooleanv returns the boolean values of parameter pname.
|
||||
//
|
||||
// Many boolean parameters can be queried more easily using IsEnabled.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGet.xhtml
|
||||
GetBooleanv(dst []bool, pname Enum)
|
||||
|
||||
// GetFloatv returns the float values of parameter pname.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGet.xhtml
|
||||
GetFloatv(dst []float32, pname Enum)
|
||||
|
||||
// GetIntegerv returns the int values of parameter pname.
|
||||
//
|
||||
// Single values may be queried more easily using GetInteger.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGet.xhtml
|
||||
GetIntegerv(dst []int32, pname Enum)
|
||||
|
||||
// GetInteger returns the int value of parameter pname.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGet.xhtml
|
||||
GetInteger(pname Enum) int
|
||||
|
||||
// GetBufferParameteri returns a parameter for the active buffer.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetBufferParameter.xhtml
|
||||
GetBufferParameteri(target, value Enum) int
|
||||
|
||||
// GetError returns the next error.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetError.xhtml
|
||||
GetError() Enum
|
||||
|
||||
// GetFramebufferAttachmentParameteri returns attachment parameters
|
||||
// for the active framebuffer object.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetFramebufferAttachmentParameteriv.xhtml
|
||||
GetFramebufferAttachmentParameteri(target, attachment, pname Enum) int
|
||||
|
||||
// GetProgrami returns a parameter value for a program.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetProgramiv.xhtml
|
||||
GetProgrami(p Program, pname Enum) int
|
||||
|
||||
// GetProgramInfoLog returns the information log for a program.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetProgramInfoLog.xhtml
|
||||
GetProgramInfoLog(p Program) string
|
||||
|
||||
// GetRenderbufferParameteri returns a parameter value for a render buffer.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetRenderbufferParameteriv.xhtml
|
||||
GetRenderbufferParameteri(target, pname Enum) int
|
||||
|
||||
// GetShaderi returns a parameter value for a shader.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetShaderiv.xhtml
|
||||
GetShaderi(s Shader, pname Enum) int
|
||||
|
||||
// GetShaderInfoLog returns the information log for a shader.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetShaderInfoLog.xhtml
|
||||
GetShaderInfoLog(s Shader) string
|
||||
|
||||
// GetShaderPrecisionFormat returns range and precision limits for
|
||||
// shader types.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetShaderPrecisionFormat.xhtml
|
||||
GetShaderPrecisionFormat(shadertype, precisiontype Enum) (rangeLow, rangeHigh, precision int)
|
||||
|
||||
// GetShaderSource returns source code of shader s.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetShaderSource.xhtml
|
||||
GetShaderSource(s Shader) string
|
||||
|
||||
// GetString reports current GL state.
|
||||
//
|
||||
// Valid name values:
|
||||
// EXTENSIONS
|
||||
// RENDERER
|
||||
// SHADING_LANGUAGE_VERSION
|
||||
// VENDOR
|
||||
// VERSION
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetString.xhtml
|
||||
GetString(pname Enum) string
|
||||
|
||||
// GetTexParameterfv returns the float values of a texture parameter.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetTexParameter.xhtml
|
||||
GetTexParameterfv(dst []float32, target, pname Enum)
|
||||
|
||||
// GetTexParameteriv returns the int values of a texture parameter.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetTexParameter.xhtml
|
||||
GetTexParameteriv(dst []int32, target, pname Enum)
|
||||
|
||||
// GetUniformfv returns the float values of a uniform variable.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetUniform.xhtml
|
||||
GetUniformfv(dst []float32, src Uniform, p Program)
|
||||
|
||||
// GetUniformiv returns the float values of a uniform variable.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetUniform.xhtml
|
||||
GetUniformiv(dst []int32, src Uniform, p Program)
|
||||
|
||||
// GetUniformLocation returns the location of a uniform variable.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetUniformLocation.xhtml
|
||||
GetUniformLocation(p Program, name string) Uniform
|
||||
|
||||
// GetVertexAttribf reads the float value of a vertex attribute.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetVertexAttrib.xhtml
|
||||
GetVertexAttribf(src Attrib, pname Enum) float32
|
||||
|
||||
// GetVertexAttribfv reads float values of a vertex attribute.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetVertexAttrib.xhtml
|
||||
GetVertexAttribfv(dst []float32, src Attrib, pname Enum)
|
||||
|
||||
// GetVertexAttribi reads the int value of a vertex attribute.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetVertexAttrib.xhtml
|
||||
GetVertexAttribi(src Attrib, pname Enum) int32
|
||||
|
||||
// GetVertexAttribiv reads int values of a vertex attribute.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glGetVertexAttrib.xhtml
|
||||
GetVertexAttribiv(dst []int32, src Attrib, pname Enum)
|
||||
|
||||
// TODO(crawshaw): glGetVertexAttribPointerv
|
||||
|
||||
// Hint sets implementation-specific modes.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glHint.xhtml
|
||||
Hint(target, mode Enum)
|
||||
|
||||
// IsBuffer reports if b is a valid buffer.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glIsBuffer.xhtml
|
||||
IsBuffer(b Buffer) bool
|
||||
|
||||
// IsEnabled reports if cap is an enabled capability.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glIsEnabled.xhtml
|
||||
IsEnabled(cap Enum) bool
|
||||
|
||||
// IsFramebuffer reports if fb is a valid frame buffer.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glIsFramebuffer.xhtml
|
||||
IsFramebuffer(fb Framebuffer) bool
|
||||
|
||||
// IsProgram reports if p is a valid program object.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glIsProgram.xhtml
|
||||
IsProgram(p Program) bool
|
||||
|
||||
// IsRenderbuffer reports if rb is a valid render buffer.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glIsRenderbuffer.xhtml
|
||||
IsRenderbuffer(rb Renderbuffer) bool
|
||||
|
||||
// IsShader reports if s is valid shader.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glIsShader.xhtml
|
||||
IsShader(s Shader) bool
|
||||
|
||||
// IsTexture reports if t is a valid texture.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glIsTexture.xhtml
|
||||
IsTexture(t Texture) bool
|
||||
|
||||
// LineWidth specifies the width of lines.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glLineWidth.xhtml
|
||||
LineWidth(width float32)
|
||||
|
||||
// LinkProgram links the specified program.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glLinkProgram.xhtml
|
||||
LinkProgram(p Program)
|
||||
|
||||
// PixelStorei sets pixel storage parameters.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glPixelStorei.xhtml
|
||||
PixelStorei(pname Enum, param int32)
|
||||
|
||||
// PolygonOffset sets the scaling factors for depth offsets.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glPolygonOffset.xhtml
|
||||
PolygonOffset(factor, units float32)
|
||||
|
||||
// ReadPixels returns pixel data from a buffer.
|
||||
//
|
||||
// In GLES 3, the source buffer is controlled with ReadBuffer.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glReadPixels.xhtml
|
||||
ReadPixels(dst []byte, x, y, width, height int, format, ty Enum)
|
||||
|
||||
// ReleaseShaderCompiler frees resources allocated by the shader compiler.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glReleaseShaderCompiler.xhtml
|
||||
ReleaseShaderCompiler()
|
||||
|
||||
// RenderbufferStorage establishes the data storage, format, and
|
||||
// dimensions of a renderbuffer object's image.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glRenderbufferStorage.xhtml
|
||||
RenderbufferStorage(target, internalFormat Enum, width, height int)
|
||||
|
||||
// SampleCoverage sets multisample coverage parameters.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glSampleCoverage.xhtml
|
||||
SampleCoverage(value float32, invert bool)
|
||||
|
||||
// Scissor defines the scissor box rectangle, in window coordinates.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glScissor.xhtml
|
||||
Scissor(x, y, width, height int32)
|
||||
|
||||
// TODO(crawshaw): ShaderBinary
|
||||
|
||||
// ShaderSource sets the source code of s to the given source code.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glShaderSource.xhtml
|
||||
ShaderSource(s Shader, src string)
|
||||
|
||||
// StencilFunc sets the front and back stencil test reference value.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glStencilFunc.xhtml
|
||||
StencilFunc(fn Enum, ref int, mask uint32)
|
||||
|
||||
// StencilFuncSeparate sets the front or back stencil test reference value.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glStencilFuncSeparate.xhtml
|
||||
StencilFuncSeparate(face, fn Enum, ref int, mask uint32)
|
||||
|
||||
// StencilMask controls the writing of bits in the stencil planes.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glStencilMask.xhtml
|
||||
StencilMask(mask uint32)
|
||||
|
||||
// StencilMaskSeparate controls the writing of bits in the stencil planes.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glStencilMaskSeparate.xhtml
|
||||
StencilMaskSeparate(face Enum, mask uint32)
|
||||
|
||||
// StencilOp sets front and back stencil test actions.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glStencilOp.xhtml
|
||||
StencilOp(fail, zfail, zpass Enum)
|
||||
|
||||
// StencilOpSeparate sets front or back stencil tests.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glStencilOpSeparate.xhtml
|
||||
StencilOpSeparate(face, sfail, dpfail, dppass Enum)
|
||||
|
||||
// TexImage2D writes a 2D texture image.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glTexImage2D.xhtml
|
||||
TexImage2D(target Enum, level int, internalFormat int, width, height int, format Enum, ty Enum, data []byte)
|
||||
|
||||
// TexSubImage2D writes a subregion of a 2D texture image.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glTexSubImage2D.xhtml
|
||||
TexSubImage2D(target Enum, level int, x, y, width, height int, format, ty Enum, data []byte)
|
||||
|
||||
// TexParameterf sets a float texture parameter.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glTexParameter.xhtml
|
||||
TexParameterf(target, pname Enum, param float32)
|
||||
|
||||
// TexParameterfv sets a float texture parameter array.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glTexParameter.xhtml
|
||||
TexParameterfv(target, pname Enum, params []float32)
|
||||
|
||||
// TexParameteri sets an integer texture parameter.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glTexParameter.xhtml
|
||||
TexParameteri(target, pname Enum, param int)
|
||||
|
||||
// TexParameteriv sets an integer texture parameter array.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glTexParameter.xhtml
|
||||
TexParameteriv(target, pname Enum, params []int32)
|
||||
|
||||
// Uniform1f writes a float uniform variable.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
|
||||
Uniform1f(dst Uniform, v float32)
|
||||
|
||||
// Uniform1fv writes a [len(src)]float uniform array.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
|
||||
Uniform1fv(dst Uniform, src []float32)
|
||||
|
||||
// Uniform1i writes an int uniform variable.
|
||||
//
|
||||
// Uniform1i and Uniform1iv are the only two functions that may be used
|
||||
// to load uniform variables defined as sampler types. Loading samplers
|
||||
// with any other function will result in a INVALID_OPERATION error.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
|
||||
Uniform1i(dst Uniform, v int)
|
||||
|
||||
// Uniform1iv writes a int uniform array of len(src) elements.
|
||||
//
|
||||
// Uniform1i and Uniform1iv are the only two functions that may be used
|
||||
// to load uniform variables defined as sampler types. Loading samplers
|
||||
// with any other function will result in a INVALID_OPERATION error.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
|
||||
Uniform1iv(dst Uniform, src []int32)
|
||||
|
||||
// Uniform2f writes a vec2 uniform variable.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
|
||||
Uniform2f(dst Uniform, v0, v1 float32)
|
||||
|
||||
// Uniform2fv writes a vec2 uniform array of len(src)/2 elements.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
|
||||
Uniform2fv(dst Uniform, src []float32)
|
||||
|
||||
// Uniform2i writes an ivec2 uniform variable.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
|
||||
Uniform2i(dst Uniform, v0, v1 int)
|
||||
|
||||
// Uniform2iv writes an ivec2 uniform array of len(src)/2 elements.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
|
||||
Uniform2iv(dst Uniform, src []int32)
|
||||
|
||||
// Uniform3f writes a vec3 uniform variable.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
|
||||
Uniform3f(dst Uniform, v0, v1, v2 float32)
|
||||
|
||||
// Uniform3fv writes a vec3 uniform array of len(src)/3 elements.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
|
||||
Uniform3fv(dst Uniform, src []float32)
|
||||
|
||||
// Uniform3i writes an ivec3 uniform variable.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
|
||||
Uniform3i(dst Uniform, v0, v1, v2 int32)
|
||||
|
||||
// Uniform3iv writes an ivec3 uniform array of len(src)/3 elements.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
|
||||
Uniform3iv(dst Uniform, src []int32)
|
||||
|
||||
// Uniform4f writes a vec4 uniform variable.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
|
||||
Uniform4f(dst Uniform, v0, v1, v2, v3 float32)
|
||||
|
||||
// Uniform4fv writes a vec4 uniform array of len(src)/4 elements.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
|
||||
Uniform4fv(dst Uniform, src []float32)
|
||||
|
||||
// Uniform4i writes an ivec4 uniform variable.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
|
||||
Uniform4i(dst Uniform, v0, v1, v2, v3 int32)
|
||||
|
||||
// Uniform4iv writes an ivec4 uniform array of len(src)/4 elements.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
|
||||
Uniform4iv(dst Uniform, src []int32)
|
||||
|
||||
// UniformMatrix2fv writes 2x2 matrices. Each matrix uses four
|
||||
// float32 values, so the number of matrices written is len(src)/4.
|
||||
//
|
||||
// Each matrix must be supplied in column major order.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
|
||||
UniformMatrix2fv(dst Uniform, src []float32)
|
||||
|
||||
// UniformMatrix3fv writes 3x3 matrices. Each matrix uses nine
|
||||
// float32 values, so the number of matrices written is len(src)/9.
|
||||
//
|
||||
// Each matrix must be supplied in column major order.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
|
||||
UniformMatrix3fv(dst Uniform, src []float32)
|
||||
|
||||
// UniformMatrix4fv writes 4x4 matrices. Each matrix uses 16
|
||||
// float32 values, so the number of matrices written is len(src)/16.
|
||||
//
|
||||
// Each matrix must be supplied in column major order.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml
|
||||
UniformMatrix4fv(dst Uniform, src []float32)
|
||||
|
||||
// UseProgram sets the active program.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glUseProgram.xhtml
|
||||
UseProgram(p Program)
|
||||
|
||||
// ValidateProgram checks to see whether the executables contained in
|
||||
// program can execute given the current OpenGL state.
|
||||
//
|
||||
// Typically only used for debugging.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glValidateProgram.xhtml
|
||||
ValidateProgram(p Program)
|
||||
|
||||
// VertexAttrib1f writes a float vertex attribute.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glVertexAttrib.xhtml
|
||||
VertexAttrib1f(dst Attrib, x float32)
|
||||
|
||||
// VertexAttrib1fv writes a float vertex attribute.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glVertexAttrib.xhtml
|
||||
VertexAttrib1fv(dst Attrib, src []float32)
|
||||
|
||||
// VertexAttrib2f writes a vec2 vertex attribute.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glVertexAttrib.xhtml
|
||||
VertexAttrib2f(dst Attrib, x, y float32)
|
||||
|
||||
// VertexAttrib2fv writes a vec2 vertex attribute.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glVertexAttrib.xhtml
|
||||
VertexAttrib2fv(dst Attrib, src []float32)
|
||||
|
||||
// VertexAttrib3f writes a vec3 vertex attribute.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glVertexAttrib.xhtml
|
||||
VertexAttrib3f(dst Attrib, x, y, z float32)
|
||||
|
||||
// VertexAttrib3fv writes a vec3 vertex attribute.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glVertexAttrib.xhtml
|
||||
VertexAttrib3fv(dst Attrib, src []float32)
|
||||
|
||||
// VertexAttrib4f writes a vec4 vertex attribute.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glVertexAttrib.xhtml
|
||||
VertexAttrib4f(dst Attrib, x, y, z, w float32)
|
||||
|
||||
// VertexAttrib4fv writes a vec4 vertex attribute.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glVertexAttrib.xhtml
|
||||
VertexAttrib4fv(dst Attrib, src []float32)
|
||||
|
||||
// VertexAttribPointer uses a bound buffer to define vertex attribute data.
|
||||
//
|
||||
// Direct use of VertexAttribPointer to load data into OpenGL is not
|
||||
// supported via the Go bindings. Instead, use BindBuffer with an
|
||||
// ARRAY_BUFFER and then fill it using BufferData.
|
||||
//
|
||||
// The size argument specifies the number of components per attribute,
|
||||
// between 1-4. The stride argument specifies the byte offset between
|
||||
// consecutive vertex attributes.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glVertexAttribPointer.xhtml
|
||||
VertexAttribPointer(dst Attrib, size int, ty Enum, normalized bool, stride, offset int)
|
||||
|
||||
// Viewport sets the viewport, an affine transformation that
|
||||
// normalizes device coordinates to window coordinates.
|
||||
//
|
||||
// http://www.khronos.org/opengles/sdk/docs/man3/html/glViewport.xhtml
|
||||
Viewport(x, y, width, height int)
|
||||
}
|
||||
|
||||
// Context3 is an OpenGL ES 3 context.
|
||||
//
|
||||
// When the gl package is compiled with GL ES 3 support, the produced
|
||||
// Context object also implements the Context3 interface.
|
||||
type Context3 interface {
|
||||
Context
|
||||
|
||||
// BlitFramebuffer copies a block of pixels between framebuffers.
|
||||
//
|
||||
// https://www.khronos.org/opengles/sdk/docs/man3/html/glBlitFramebuffer.xhtml
|
||||
BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1 int, mask uint, filter Enum)
|
||||
}
|
||||
|
||||
// Worker is used by display driver code to execute OpenGL calls.
|
||||
//
|
||||
// Typically display driver code creates a gl.Context for an application,
|
||||
// and along with it establishes a locked OS thread to execute the cgo
|
||||
// calls:
|
||||
//
|
||||
// go func() {
|
||||
// runtime.LockOSThread()
|
||||
// // ... platform-specific cgo call to bind a C OpenGL context
|
||||
// // into thread-local storage.
|
||||
//
|
||||
// glctx, worker := gl.NewContext()
|
||||
// workAvailable := worker.WorkAvailable()
|
||||
// go userAppCode(glctx)
|
||||
// for {
|
||||
// select {
|
||||
// case <-workAvailable:
|
||||
// worker.DoWork()
|
||||
// case <-drawEvent:
|
||||
// // ... platform-specific cgo call to draw screen
|
||||
// }
|
||||
// }
|
||||
// }()
|
||||
//
|
||||
// This interface is an internal implementation detail and should only be used
|
||||
// by the package responsible for managing the screen, such as
|
||||
// golang.org/x/mobile/app.
|
||||
type Worker interface {
|
||||
// WorkAvailable returns a channel that communicates when DoWork should be
|
||||
// called.
|
||||
WorkAvailable() <-chan struct{}
|
||||
|
||||
// DoWork performs any pending OpenGL calls.
|
||||
DoWork()
|
||||
}
|
81
gl/types_debug.go
Normal file
81
gl/types_debug.go
Normal file
|
@ -0,0 +1,81 @@
|
|||
// Copyright 2014 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build (darwin || linux || openbsd || windows) && gldebug
|
||||
|
||||
package gl
|
||||
|
||||
// Alternate versions of the types defined in types.go with extra
|
||||
// debugging information attached. For documentation, see types.go.
|
||||
|
||||
import "fmt"
|
||||
|
||||
type Enum uint32
|
||||
|
||||
type Attrib struct {
|
||||
Value uint
|
||||
name string
|
||||
}
|
||||
|
||||
type Program struct {
|
||||
Init bool
|
||||
Value uint32
|
||||
}
|
||||
|
||||
type Shader struct {
|
||||
Value uint32
|
||||
}
|
||||
|
||||
type Buffer struct {
|
||||
Value uint32
|
||||
}
|
||||
|
||||
type Framebuffer struct {
|
||||
Value uint32
|
||||
}
|
||||
|
||||
type Renderbuffer struct {
|
||||
Value uint32
|
||||
}
|
||||
|
||||
type Texture struct {
|
||||
Value uint32
|
||||
}
|
||||
|
||||
type Uniform struct {
|
||||
Value int32
|
||||
name string
|
||||
}
|
||||
|
||||
type VertexArray struct {
|
||||
Value uint32
|
||||
}
|
||||
|
||||
func (v Attrib) c() uintptr { return uintptr(v.Value) }
|
||||
func (v Enum) c() uintptr { return uintptr(v) }
|
||||
func (v Program) c() uintptr {
|
||||
if !v.Init {
|
||||
ret := uintptr(0)
|
||||
ret--
|
||||
return ret
|
||||
}
|
||||
return uintptr(v.Value)
|
||||
}
|
||||
func (v Shader) c() uintptr { return uintptr(v.Value) }
|
||||
func (v Buffer) c() uintptr { return uintptr(v.Value) }
|
||||
func (v Framebuffer) c() uintptr { return uintptr(v.Value) }
|
||||
func (v Renderbuffer) c() uintptr { return uintptr(v.Value) }
|
||||
func (v Texture) c() uintptr { return uintptr(v.Value) }
|
||||
func (v Uniform) c() uintptr { return uintptr(v.Value) }
|
||||
func (v VertexArray) c() uintptr { return uintptr(v.Value) }
|
||||
|
||||
func (v Attrib) String() string { return fmt.Sprintf("Attrib(%d:%s)", v.Value, v.name) }
|
||||
func (v Program) String() string { return fmt.Sprintf("Program(%d)", v.Value) }
|
||||
func (v Shader) String() string { return fmt.Sprintf("Shader(%d)", v.Value) }
|
||||
func (v Buffer) String() string { return fmt.Sprintf("Buffer(%d)", v.Value) }
|
||||
func (v Framebuffer) String() string { return fmt.Sprintf("Framebuffer(%d)", v.Value) }
|
||||
func (v Renderbuffer) String() string { return fmt.Sprintf("Renderbuffer(%d)", v.Value) }
|
||||
func (v Texture) String() string { return fmt.Sprintf("Texture(%d)", v.Value) }
|
||||
func (v Uniform) String() string { return fmt.Sprintf("Uniform(%d:%s)", v.Value, v.name) }
|
||||
func (v VertexArray) String() string { return fmt.Sprintf("VertexArray(%d)", v.Value) }
|
92
gl/types_prod.go
Normal file
92
gl/types_prod.go
Normal file
|
@ -0,0 +1,92 @@
|
|||
// Copyright 2014 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build (darwin || linux || openbsd || windows) && !gldebug
|
||||
|
||||
package gl
|
||||
|
||||
import "fmt"
|
||||
|
||||
// Enum is equivalent to GLenum, and is normally used with one of the
|
||||
// constants defined in this package.
|
||||
type Enum uint32
|
||||
|
||||
// Types are defined a structs so that in debug mode they can carry
|
||||
// extra information, such as a string name. See typesdebug.go.
|
||||
|
||||
// Attrib identifies the location of a specific attribute variable.
|
||||
type Attrib struct {
|
||||
Value uint
|
||||
}
|
||||
|
||||
// Program identifies a compiled shader program.
|
||||
type Program struct {
|
||||
// Init is set by CreateProgram, as some GL drivers (in particular,
|
||||
// ANGLE) return true for glIsProgram(0).
|
||||
Init bool
|
||||
Value uint32
|
||||
}
|
||||
|
||||
// Shader identifies a GLSL shader.
|
||||
type Shader struct {
|
||||
Value uint32
|
||||
}
|
||||
|
||||
// Buffer identifies a GL buffer object.
|
||||
type Buffer struct {
|
||||
Value uint32
|
||||
}
|
||||
|
||||
// Framebuffer identifies a GL framebuffer.
|
||||
type Framebuffer struct {
|
||||
Value uint32
|
||||
}
|
||||
|
||||
// A Renderbuffer is a GL object that holds an image in an internal format.
|
||||
type Renderbuffer struct {
|
||||
Value uint32
|
||||
}
|
||||
|
||||
// A Texture identifies a GL texture unit.
|
||||
type Texture struct {
|
||||
Value uint32
|
||||
}
|
||||
|
||||
// Uniform identifies the location of a specific uniform variable.
|
||||
type Uniform struct {
|
||||
Value int32
|
||||
}
|
||||
|
||||
// A VertexArray is a GL object that holds vertices in an internal format.
|
||||
type VertexArray struct {
|
||||
Value uint32
|
||||
}
|
||||
|
||||
func (v Attrib) c() uintptr { return uintptr(v.Value) }
|
||||
func (v Enum) c() uintptr { return uintptr(v) }
|
||||
func (v Program) c() uintptr {
|
||||
if !v.Init {
|
||||
ret := uintptr(0)
|
||||
ret--
|
||||
return ret
|
||||
}
|
||||
return uintptr(v.Value)
|
||||
}
|
||||
func (v Shader) c() uintptr { return uintptr(v.Value) }
|
||||
func (v Buffer) c() uintptr { return uintptr(v.Value) }
|
||||
func (v Framebuffer) c() uintptr { return uintptr(v.Value) }
|
||||
func (v Renderbuffer) c() uintptr { return uintptr(v.Value) }
|
||||
func (v Texture) c() uintptr { return uintptr(v.Value) }
|
||||
func (v Uniform) c() uintptr { return uintptr(v.Value) }
|
||||
func (v VertexArray) c() uintptr { return uintptr(v.Value) }
|
||||
|
||||
func (v Attrib) String() string { return fmt.Sprintf("Attrib(%d)", v.Value) }
|
||||
func (v Program) String() string { return fmt.Sprintf("Program(%d)", v.Value) }
|
||||
func (v Shader) String() string { return fmt.Sprintf("Shader(%d)", v.Value) }
|
||||
func (v Buffer) String() string { return fmt.Sprintf("Buffer(%d)", v.Value) }
|
||||
func (v Framebuffer) String() string { return fmt.Sprintf("Framebuffer(%d)", v.Value) }
|
||||
func (v Renderbuffer) String() string { return fmt.Sprintf("Renderbuffer(%d)", v.Value) }
|
||||
func (v Texture) String() string { return fmt.Sprintf("Texture(%d)", v.Value) }
|
||||
func (v Uniform) String() string { return fmt.Sprintf("Uniform(%d)", v.Value) }
|
||||
func (v VertexArray) String() string { return fmt.Sprintf("VertexArray(%d)", v.Value) }
|
557
gl/work.c
Normal file
557
gl/work.c
Normal file
|
@ -0,0 +1,557 @@
|
|||
// Copyright 2015 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build darwin || linux || openbsd
|
||||
// +build darwin linux openbsd
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "_cgo_export.h"
|
||||
#include "work.h"
|
||||
|
||||
#if defined(GL_ES_VERSION_3_0) && GL_ES_VERSION_3_0
|
||||
#else
|
||||
#include <stdio.h>
|
||||
static void gles3missing() {
|
||||
printf("GLES3 function is missing\n");
|
||||
exit(2);
|
||||
}
|
||||
static void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { gles3missing(); }
|
||||
static void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { gles3missing(); }
|
||||
static void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { gles3missing(); }
|
||||
static void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { gles3missing(); }
|
||||
static void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { gles3missing(); }
|
||||
static void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { gles3missing(); }
|
||||
static void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { gles3missing(); }
|
||||
static void glUniform1ui(GLint location, GLuint v0) { gles3missing(); }
|
||||
static void glUniform2ui(GLint location, GLuint v0, GLuint v1) { gles3missing(); }
|
||||
static void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2) { gles3missing(); }
|
||||
static void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) { gles3missing(); }
|
||||
static void glUniform1uiv(GLint location, GLsizei count, const GLuint *value) { gles3missing(); }
|
||||
static void glUniform2uiv(GLint location, GLsizei count, const GLuint *value) { gles3missing(); }
|
||||
static void glUniform3uiv(GLint location, GLsizei count, const GLuint *value) { gles3missing(); }
|
||||
static void glUniform4uiv(GLint location, GLsizei count, const GLuint *value) { gles3missing(); }
|
||||
static void glBindVertexArray(GLuint array) { gles3missing(); }
|
||||
static void glGenVertexArrays(GLsizei n, GLuint *arrays) { gles3missing(); }
|
||||
static void glDeleteVertexArrays(GLsizei n, const GLuint *arrays) { gles3missing(); }
|
||||
#endif
|
||||
|
||||
uintptr_t processFn(struct fnargs* args, char* parg) {
|
||||
uintptr_t ret = 0;
|
||||
switch (args->fn) {
|
||||
case glfnUNDEFINED:
|
||||
abort(); // bad glfn
|
||||
break;
|
||||
case glfnActiveTexture:
|
||||
glActiveTexture((GLenum)args->a0);
|
||||
break;
|
||||
case glfnAttachShader:
|
||||
glAttachShader((GLint)args->a0, (GLint)args->a1);
|
||||
break;
|
||||
case glfnBindAttribLocation:
|
||||
glBindAttribLocation((GLint)args->a0, (GLint)args->a1, (GLchar*)args->a2);
|
||||
break;
|
||||
case glfnBindBuffer:
|
||||
glBindBuffer((GLenum)args->a0, (GLuint)args->a1);
|
||||
break;
|
||||
case glfnBindFramebuffer:
|
||||
glBindFramebuffer((GLenum)args->a0, (GLint)args->a1);
|
||||
break;
|
||||
case glfnBindRenderbuffer:
|
||||
glBindRenderbuffer((GLenum)args->a0, (GLint)args->a1);
|
||||
break;
|
||||
case glfnBindTexture:
|
||||
glBindTexture((GLenum)args->a0, (GLint)args->a1);
|
||||
break;
|
||||
case glfnBindVertexArray:
|
||||
glBindVertexArray((GLenum)args->a0);
|
||||
break;
|
||||
case glfnBlendColor:
|
||||
glBlendColor(*(GLfloat*)&args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3);
|
||||
break;
|
||||
case glfnBlendEquation:
|
||||
glBlendEquation((GLenum)args->a0);
|
||||
break;
|
||||
case glfnBlendEquationSeparate:
|
||||
glBlendEquationSeparate((GLenum)args->a0, (GLenum)args->a1);
|
||||
break;
|
||||
case glfnBlendFunc:
|
||||
glBlendFunc((GLenum)args->a0, (GLenum)args->a1);
|
||||
break;
|
||||
case glfnBlendFuncSeparate:
|
||||
glBlendFuncSeparate((GLenum)args->a0, (GLenum)args->a1, (GLenum)args->a2, (GLenum)args->a3);
|
||||
break;
|
||||
case glfnBlitFramebuffer:
|
||||
glBlitFramebuffer((GLint)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3, (GLint)args->a4, (GLint)args->a5, (GLint)args->a6, (GLint)args->a7, (GLbitfield)args->a8, (GLenum)args->a9);
|
||||
break;
|
||||
case glfnBufferData:
|
||||
glBufferData((GLenum)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg, (GLenum)args->a2);
|
||||
break;
|
||||
case glfnBufferSubData:
|
||||
glBufferSubData((GLenum)args->a0, (GLint)args->a1, (GLsizeiptr)args->a2, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnCheckFramebufferStatus:
|
||||
ret = glCheckFramebufferStatus((GLenum)args->a0);
|
||||
break;
|
||||
case glfnClear:
|
||||
glClear((GLenum)args->a0);
|
||||
break;
|
||||
case glfnClearColor:
|
||||
glClearColor(*(GLfloat*)&args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3);
|
||||
break;
|
||||
case glfnClearDepthf:
|
||||
glClearDepthf(*(GLfloat*)&args->a0);
|
||||
break;
|
||||
case glfnClearStencil:
|
||||
glClearStencil((GLint)args->a0);
|
||||
break;
|
||||
case glfnColorMask:
|
||||
glColorMask((GLboolean)args->a0, (GLboolean)args->a1, (GLboolean)args->a2, (GLboolean)args->a3);
|
||||
break;
|
||||
case glfnCompileShader:
|
||||
glCompileShader((GLint)args->a0);
|
||||
break;
|
||||
case glfnCompressedTexImage2D:
|
||||
glCompressedTexImage2D((GLenum)args->a0, (GLint)args->a1, (GLenum)args->a2, (GLint)args->a3, (GLint)args->a4, (GLint)args->a5, (GLsizeiptr)args->a6, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnCompressedTexSubImage2D:
|
||||
glCompressedTexSubImage2D((GLenum)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3, (GLint)args->a4, (GLint)args->a5, (GLenum)args->a6, (GLsizeiptr)args->a7, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnCopyTexImage2D:
|
||||
glCopyTexImage2D((GLenum)args->a0, (GLint)args->a1, (GLenum)args->a2, (GLint)args->a3, (GLint)args->a4, (GLint)args->a5, (GLint)args->a6, (GLint)args->a7);
|
||||
break;
|
||||
case glfnCopyTexSubImage2D:
|
||||
glCopyTexSubImage2D((GLenum)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3, (GLint)args->a4, (GLint)args->a5, (GLint)args->a6, (GLint)args->a7);
|
||||
break;
|
||||
case glfnCreateProgram:
|
||||
ret = glCreateProgram();
|
||||
break;
|
||||
case glfnCreateShader:
|
||||
ret = glCreateShader((GLenum)args->a0);
|
||||
break;
|
||||
case glfnCullFace:
|
||||
glCullFace((GLenum)args->a0);
|
||||
break;
|
||||
case glfnDeleteBuffer:
|
||||
glDeleteBuffers(1, (const GLuint*)(&args->a0));
|
||||
break;
|
||||
case glfnDeleteFramebuffer:
|
||||
glDeleteFramebuffers(1, (const GLuint*)(&args->a0));
|
||||
break;
|
||||
case glfnDeleteProgram:
|
||||
glDeleteProgram((GLint)args->a0);
|
||||
break;
|
||||
case glfnDeleteRenderbuffer:
|
||||
glDeleteRenderbuffers(1, (const GLuint*)(&args->a0));
|
||||
break;
|
||||
case glfnDeleteShader:
|
||||
glDeleteShader((GLint)args->a0);
|
||||
break;
|
||||
case glfnDeleteTexture:
|
||||
glDeleteTextures(1, (const GLuint*)(&args->a0));
|
||||
break;
|
||||
case glfnDeleteVertexArray:
|
||||
glDeleteVertexArrays(1, (const GLuint*)(&args->a0));
|
||||
break;
|
||||
case glfnDepthFunc:
|
||||
glDepthFunc((GLenum)args->a0);
|
||||
break;
|
||||
case glfnDepthMask:
|
||||
glDepthMask((GLboolean)args->a0);
|
||||
break;
|
||||
case glfnDepthRangef:
|
||||
glDepthRangef(*(GLfloat*)&args->a0, *(GLfloat*)&args->a1);
|
||||
break;
|
||||
case glfnDetachShader:
|
||||
glDetachShader((GLint)args->a0, (GLint)args->a1);
|
||||
break;
|
||||
case glfnDisable:
|
||||
glDisable((GLenum)args->a0);
|
||||
break;
|
||||
case glfnDisableVertexAttribArray:
|
||||
glDisableVertexAttribArray((GLint)args->a0);
|
||||
break;
|
||||
case glfnDrawArrays:
|
||||
glDrawArrays((GLenum)args->a0, (GLint)args->a1, (GLint)args->a2);
|
||||
break;
|
||||
case glfnDrawElements:
|
||||
glDrawElements((GLenum)args->a0, (GLint)args->a1, (GLenum)args->a2, (void*)args->a3);
|
||||
break;
|
||||
case glfnEnable:
|
||||
glEnable((GLenum)args->a0);
|
||||
break;
|
||||
case glfnEnableVertexAttribArray:
|
||||
glEnableVertexAttribArray((GLint)args->a0);
|
||||
break;
|
||||
case glfnFinish:
|
||||
glFinish();
|
||||
break;
|
||||
case glfnFlush:
|
||||
glFlush();
|
||||
break;
|
||||
case glfnFramebufferRenderbuffer:
|
||||
glFramebufferRenderbuffer((GLenum)args->a0, (GLenum)args->a1, (GLenum)args->a2, (GLint)args->a3);
|
||||
break;
|
||||
case glfnFramebufferTexture2D:
|
||||
glFramebufferTexture2D((GLenum)args->a0, (GLenum)args->a1, (GLenum)args->a2, (GLint)args->a3, (GLint)args->a4);
|
||||
break;
|
||||
case glfnFrontFace:
|
||||
glFrontFace((GLenum)args->a0);
|
||||
break;
|
||||
case glfnGenBuffer:
|
||||
glGenBuffers(1, (GLuint*)&ret);
|
||||
break;
|
||||
case glfnGenFramebuffer:
|
||||
glGenFramebuffers(1, (GLuint*)&ret);
|
||||
break;
|
||||
case glfnGenRenderbuffer:
|
||||
glGenRenderbuffers(1, (GLuint*)&ret);
|
||||
break;
|
||||
case glfnGenTexture:
|
||||
glGenTextures(1, (GLuint*)&ret);
|
||||
break;
|
||||
case glfnGenVertexArray:
|
||||
glGenVertexArrays(1, (GLuint*)&ret);
|
||||
break;
|
||||
case glfnGenerateMipmap:
|
||||
glGenerateMipmap((GLenum)args->a0);
|
||||
break;
|
||||
case glfnGetActiveAttrib:
|
||||
glGetActiveAttrib(
|
||||
(GLuint)args->a0,
|
||||
(GLuint)args->a1,
|
||||
(GLsizei)args->a2,
|
||||
NULL,
|
||||
(GLint*)&ret,
|
||||
(GLenum*)args->a3,
|
||||
(GLchar*)parg);
|
||||
break;
|
||||
case glfnGetActiveUniform:
|
||||
glGetActiveUniform(
|
||||
(GLuint)args->a0,
|
||||
(GLuint)args->a1,
|
||||
(GLsizei)args->a2,
|
||||
NULL,
|
||||
(GLint*)&ret,
|
||||
(GLenum*)args->a3,
|
||||
(GLchar*)parg);
|
||||
break;
|
||||
case glfnGetAttachedShaders:
|
||||
glGetAttachedShaders((GLuint)args->a0, (GLsizei)args->a1, (GLsizei*)&ret, (GLuint*)parg);
|
||||
break;
|
||||
case glfnGetAttribLocation:
|
||||
ret = glGetAttribLocation((GLint)args->a0, (GLchar*)args->a1);
|
||||
break;
|
||||
case glfnGetBooleanv:
|
||||
glGetBooleanv((GLenum)args->a0, (GLboolean*)parg);
|
||||
break;
|
||||
case glfnGetBufferParameteri:
|
||||
glGetBufferParameteriv((GLenum)args->a0, (GLenum)args->a1, (GLint*)&ret);
|
||||
break;
|
||||
case glfnGetFloatv:
|
||||
glGetFloatv((GLenum)args->a0, (GLfloat*)parg);
|
||||
break;
|
||||
case glfnGetIntegerv:
|
||||
glGetIntegerv((GLenum)args->a0, (GLint*)parg);
|
||||
break;
|
||||
case glfnGetError:
|
||||
ret = glGetError();
|
||||
break;
|
||||
case glfnGetFramebufferAttachmentParameteriv:
|
||||
glGetFramebufferAttachmentParameteriv((GLenum)args->a0, (GLenum)args->a1, (GLenum)args->a2, (GLint*)&ret);
|
||||
break;
|
||||
case glfnGetProgramiv:
|
||||
glGetProgramiv((GLint)args->a0, (GLenum)args->a1, (GLint*)&ret);
|
||||
break;
|
||||
case glfnGetProgramInfoLog:
|
||||
glGetProgramInfoLog((GLuint)args->a0, (GLsizei)args->a1, 0, (GLchar*)parg);
|
||||
break;
|
||||
case glfnGetRenderbufferParameteriv:
|
||||
glGetRenderbufferParameteriv((GLenum)args->a0, (GLenum)args->a1, (GLint*)&ret);
|
||||
break;
|
||||
case glfnGetShaderiv:
|
||||
glGetShaderiv((GLint)args->a0, (GLenum)args->a1, (GLint*)&ret);
|
||||
break;
|
||||
case glfnGetShaderInfoLog:
|
||||
glGetShaderInfoLog((GLuint)args->a0, (GLsizei)args->a1, 0, (GLchar*)parg);
|
||||
break;
|
||||
case glfnGetShaderPrecisionFormat:
|
||||
glGetShaderPrecisionFormat((GLenum)args->a0, (GLenum)args->a1, (GLint*)parg, &((GLint*)parg)[2]);
|
||||
break;
|
||||
case glfnGetShaderSource:
|
||||
glGetShaderSource((GLuint)args->a0, (GLsizei)args->a1, 0, (GLchar*)parg);
|
||||
break;
|
||||
case glfnGetString:
|
||||
ret = (uintptr_t)glGetString((GLenum)args->a0);
|
||||
break;
|
||||
case glfnGetTexParameterfv:
|
||||
glGetTexParameterfv((GLenum)args->a0, (GLenum)args->a1, (GLfloat*)parg);
|
||||
break;
|
||||
case glfnGetTexParameteriv:
|
||||
glGetTexParameteriv((GLenum)args->a0, (GLenum)args->a1, (GLint*)parg);
|
||||
break;
|
||||
case glfnGetUniformfv:
|
||||
glGetUniformfv((GLuint)args->a0, (GLint)args->a1, (GLfloat*)parg);
|
||||
break;
|
||||
case glfnGetUniformiv:
|
||||
glGetUniformiv((GLuint)args->a0, (GLint)args->a1, (GLint*)parg);
|
||||
break;
|
||||
case glfnGetUniformLocation:
|
||||
ret = glGetUniformLocation((GLint)args->a0, (GLchar*)args->a1);
|
||||
break;
|
||||
case glfnGetVertexAttribfv:
|
||||
glGetVertexAttribfv((GLuint)args->a0, (GLenum)args->a1, (GLfloat*)parg);
|
||||
break;
|
||||
case glfnGetVertexAttribiv:
|
||||
glGetVertexAttribiv((GLuint)args->a0, (GLenum)args->a1, (GLint*)parg);
|
||||
break;
|
||||
case glfnHint:
|
||||
glHint((GLenum)args->a0, (GLenum)args->a1);
|
||||
break;
|
||||
case glfnIsBuffer:
|
||||
ret = glIsBuffer((GLint)args->a0);
|
||||
break;
|
||||
case glfnIsEnabled:
|
||||
ret = glIsEnabled((GLenum)args->a0);
|
||||
break;
|
||||
case glfnIsFramebuffer:
|
||||
ret = glIsFramebuffer((GLint)args->a0);
|
||||
break;
|
||||
case glfnIsProgram:
|
||||
ret = glIsProgram((GLint)args->a0);
|
||||
break;
|
||||
case glfnIsRenderbuffer:
|
||||
ret = glIsRenderbuffer((GLint)args->a0);
|
||||
break;
|
||||
case glfnIsShader:
|
||||
ret = glIsShader((GLint)args->a0);
|
||||
break;
|
||||
case glfnIsTexture:
|
||||
ret = glIsTexture((GLint)args->a0);
|
||||
break;
|
||||
case glfnLineWidth:
|
||||
glLineWidth(*(GLfloat*)&args->a0);
|
||||
break;
|
||||
case glfnLinkProgram:
|
||||
glLinkProgram((GLint)args->a0);
|
||||
break;
|
||||
case glfnPixelStorei:
|
||||
glPixelStorei((GLenum)args->a0, (GLint)args->a1);
|
||||
break;
|
||||
case glfnPolygonOffset:
|
||||
glPolygonOffset(*(GLfloat*)&args->a0, *(GLfloat*)&args->a1);
|
||||
break;
|
||||
case glfnReadPixels:
|
||||
glReadPixels((GLint)args->a0, (GLint)args->a1, (GLsizei)args->a2, (GLsizei)args->a3, (GLenum)args->a4, (GLenum)args->a5, (void*)parg);
|
||||
break;
|
||||
case glfnReleaseShaderCompiler:
|
||||
glReleaseShaderCompiler();
|
||||
break;
|
||||
case glfnRenderbufferStorage:
|
||||
glRenderbufferStorage((GLenum)args->a0, (GLenum)args->a1, (GLint)args->a2, (GLint)args->a3);
|
||||
break;
|
||||
case glfnSampleCoverage:
|
||||
glSampleCoverage(*(GLfloat*)&args->a0, (GLboolean)args->a1);
|
||||
break;
|
||||
case glfnScissor:
|
||||
glScissor((GLint)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3);
|
||||
break;
|
||||
case glfnShaderSource:
|
||||
#if defined(os_ios) || defined(os_macos)
|
||||
glShaderSource((GLuint)args->a0, (GLsizei)args->a1, (const GLchar *const *)args->a2, NULL);
|
||||
#else
|
||||
glShaderSource((GLuint)args->a0, (GLsizei)args->a1, (const GLchar **)args->a2, NULL);
|
||||
#endif
|
||||
break;
|
||||
case glfnStencilFunc:
|
||||
glStencilFunc((GLenum)args->a0, (GLint)args->a1, (GLuint)args->a2);
|
||||
break;
|
||||
case glfnStencilFuncSeparate:
|
||||
glStencilFuncSeparate((GLenum)args->a0, (GLenum)args->a1, (GLint)args->a2, (GLuint)args->a3);
|
||||
break;
|
||||
case glfnStencilMask:
|
||||
glStencilMask((GLuint)args->a0);
|
||||
break;
|
||||
case glfnStencilMaskSeparate:
|
||||
glStencilMaskSeparate((GLenum)args->a0, (GLuint)args->a1);
|
||||
break;
|
||||
case glfnStencilOp:
|
||||
glStencilOp((GLenum)args->a0, (GLenum)args->a1, (GLenum)args->a2);
|
||||
break;
|
||||
case glfnStencilOpSeparate:
|
||||
glStencilOpSeparate((GLenum)args->a0, (GLenum)args->a1, (GLenum)args->a2, (GLenum)args->a3);
|
||||
break;
|
||||
case glfnTexImage2D:
|
||||
glTexImage2D(
|
||||
(GLenum)args->a0,
|
||||
(GLint)args->a1,
|
||||
(GLint)args->a2,
|
||||
(GLsizei)args->a3,
|
||||
(GLsizei)args->a4,
|
||||
0, // border
|
||||
(GLenum)args->a5,
|
||||
(GLenum)args->a6,
|
||||
(const GLvoid*)parg);
|
||||
break;
|
||||
case glfnTexSubImage2D:
|
||||
glTexSubImage2D(
|
||||
(GLenum)args->a0,
|
||||
(GLint)args->a1,
|
||||
(GLint)args->a2,
|
||||
(GLint)args->a3,
|
||||
(GLsizei)args->a4,
|
||||
(GLsizei)args->a5,
|
||||
(GLenum)args->a6,
|
||||
(GLenum)args->a7,
|
||||
(const GLvoid*)parg);
|
||||
break;
|
||||
case glfnTexParameterf:
|
||||
glTexParameterf((GLenum)args->a0, (GLenum)args->a1, *(GLfloat*)&args->a2);
|
||||
break;
|
||||
case glfnTexParameterfv:
|
||||
glTexParameterfv((GLenum)args->a0, (GLenum)args->a1, (GLfloat*)parg);
|
||||
break;
|
||||
case glfnTexParameteri:
|
||||
glTexParameteri((GLenum)args->a0, (GLenum)args->a1, (GLint)args->a2);
|
||||
break;
|
||||
case glfnTexParameteriv:
|
||||
glTexParameteriv((GLenum)args->a0, (GLenum)args->a1, (GLint*)parg);
|
||||
break;
|
||||
case glfnUniform1f:
|
||||
glUniform1f((GLint)args->a0, *(GLfloat*)&args->a1);
|
||||
break;
|
||||
case glfnUniform1fv:
|
||||
glUniform1fv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnUniform1i:
|
||||
glUniform1i((GLint)args->a0, (GLint)args->a1);
|
||||
break;
|
||||
case glfnUniform1ui:
|
||||
glUniform1ui((GLint)args->a0, (GLuint)args->a1);
|
||||
break;
|
||||
case glfnUniform1uiv:
|
||||
glUniform1uiv((GLint)args->a0, (GLsizeiptr)args->a1, (GLuint*)parg);
|
||||
break;
|
||||
case glfnUniform1iv:
|
||||
glUniform1iv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnUniform2f:
|
||||
glUniform2f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2);
|
||||
break;
|
||||
case glfnUniform2fv:
|
||||
glUniform2fv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnUniform2i:
|
||||
glUniform2i((GLint)args->a0, (GLint)args->a1, (GLint)args->a2);
|
||||
break;
|
||||
case glfnUniform2ui:
|
||||
glUniform2ui((GLint)args->a0, (GLuint)args->a1, (GLuint)args->a2);
|
||||
break;
|
||||
case glfnUniform2uiv:
|
||||
glUniform2uiv((GLint)args->a0, (GLsizeiptr)args->a1, (GLuint*)parg);
|
||||
break;
|
||||
case glfnUniform2iv:
|
||||
glUniform2iv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnUniform3f:
|
||||
glUniform3f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3);
|
||||
break;
|
||||
case glfnUniform3fv:
|
||||
glUniform3fv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnUniform3i:
|
||||
glUniform3i((GLint)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3);
|
||||
break;
|
||||
case glfnUniform3ui:
|
||||
glUniform3ui((GLint)args->a0, (GLuint)args->a1, (GLuint)args->a2, (GLuint)args->a3);
|
||||
break;
|
||||
case glfnUniform3uiv:
|
||||
glUniform3uiv((GLint)args->a0, (GLsizeiptr)args->a1, (GLuint*)parg);
|
||||
break;
|
||||
case glfnUniform3iv:
|
||||
glUniform3iv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnUniform4f:
|
||||
glUniform4f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3, *(GLfloat*)&args->a4);
|
||||
break;
|
||||
case glfnUniform4fv:
|
||||
glUniform4fv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnUniform4i:
|
||||
glUniform4i((GLint)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3, (GLint)args->a4);
|
||||
break;
|
||||
case glfnUniform4ui:
|
||||
glUniform4ui((GLint)args->a0, (GLuint)args->a1, (GLuint)args->a2, (GLuint)args->a3, (GLuint)args->a4);
|
||||
break;
|
||||
case glfnUniform4uiv:
|
||||
glUniform4uiv((GLint)args->a0, (GLsizeiptr)args->a1, (GLuint*)parg);
|
||||
break;
|
||||
case glfnUniform4iv:
|
||||
glUniform4iv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnUniformMatrix2fv:
|
||||
glUniformMatrix2fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnUniformMatrix3fv:
|
||||
glUniformMatrix3fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnUniformMatrix4fv:
|
||||
glUniformMatrix4fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnUniformMatrix2x3fv:
|
||||
glUniformMatrix2x3fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnUniformMatrix3x2fv:
|
||||
glUniformMatrix3x2fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnUniformMatrix2x4fv:
|
||||
glUniformMatrix2x4fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnUniformMatrix4x2fv:
|
||||
glUniformMatrix4x2fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnUniformMatrix3x4fv:
|
||||
glUniformMatrix3x4fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnUniformMatrix4x3fv:
|
||||
glUniformMatrix4x3fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)parg);
|
||||
break;
|
||||
case glfnUseProgram:
|
||||
glUseProgram((GLint)args->a0);
|
||||
break;
|
||||
case glfnValidateProgram:
|
||||
glValidateProgram((GLint)args->a0);
|
||||
break;
|
||||
case glfnVertexAttrib1f:
|
||||
glVertexAttrib1f((GLint)args->a0, *(GLfloat*)&args->a1);
|
||||
break;
|
||||
case glfnVertexAttrib1fv:
|
||||
glVertexAttrib1fv((GLint)args->a0, (GLfloat*)parg);
|
||||
break;
|
||||
case glfnVertexAttrib2f:
|
||||
glVertexAttrib2f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2);
|
||||
break;
|
||||
case glfnVertexAttrib2fv:
|
||||
glVertexAttrib2fv((GLint)args->a0, (GLfloat*)parg);
|
||||
break;
|
||||
case glfnVertexAttrib3f:
|
||||
glVertexAttrib3f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3);
|
||||
break;
|
||||
case glfnVertexAttrib3fv:
|
||||
glVertexAttrib3fv((GLint)args->a0, (GLfloat*)parg);
|
||||
break;
|
||||
case glfnVertexAttrib4f:
|
||||
glVertexAttrib4f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3, *(GLfloat*)&args->a4);
|
||||
break;
|
||||
case glfnVertexAttrib4fv:
|
||||
glVertexAttrib4fv((GLint)args->a0, (GLfloat*)parg);
|
||||
break;
|
||||
case glfnVertexAttribPointer:
|
||||
glVertexAttribPointer((GLuint)args->a0, (GLint)args->a1, (GLenum)args->a2, (GLboolean)args->a3, (GLsizei)args->a4, (const GLvoid*)args->a5);
|
||||
break;
|
||||
case glfnViewport:
|
||||
glViewport((GLint)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3);
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
173
gl/work.go
Normal file
173
gl/work.go
Normal file
|
@ -0,0 +1,173 @@
|
|||
// Copyright 2015 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build darwin || linux || openbsd
|
||||
|
||||
package gl
|
||||
|
||||
/*
|
||||
#cgo ios LDFLAGS: -framework OpenGLES
|
||||
#cgo darwin,!ios LDFLAGS: -framework OpenGL
|
||||
#cgo linux LDFLAGS: -lGLESv2
|
||||
#cgo openbsd LDFLAGS: -L/usr/X11R6/lib/ -lGLESv2
|
||||
|
||||
#cgo android CFLAGS: -Dos_android
|
||||
#cgo ios CFLAGS: -Dos_ios
|
||||
#cgo darwin,!ios CFLAGS: -Dos_macos
|
||||
#cgo darwin CFLAGS: -DGL_SILENCE_DEPRECATION -DGLES_SILENCE_DEPRECATION
|
||||
#cgo linux CFLAGS: -Dos_linux
|
||||
#cgo openbsd CFLAGS: -Dos_openbsd
|
||||
|
||||
#cgo openbsd CFLAGS: -I/usr/X11R6/include/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "work.h"
|
||||
|
||||
uintptr_t process(struct fnargs* cargs, char* parg0, char* parg1, char* parg2, int count) {
|
||||
uintptr_t ret;
|
||||
|
||||
ret = processFn(&cargs[0], parg0);
|
||||
if (count > 1) {
|
||||
ret = processFn(&cargs[1], parg1);
|
||||
}
|
||||
if (count > 2) {
|
||||
ret = processFn(&cargs[2], parg2);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
*/
|
||||
import "C"
|
||||
|
||||
import "unsafe"
|
||||
|
||||
const workbufLen = 3
|
||||
|
||||
type context struct {
|
||||
cptr uintptr
|
||||
debug int32
|
||||
|
||||
workAvailable chan struct{}
|
||||
|
||||
// work is a queue of calls to execute.
|
||||
work chan call
|
||||
|
||||
// retvalue is sent a return value when blocking calls complete.
|
||||
// It is safe to use a global unbuffered channel here as calls
|
||||
// cannot currently be made concurrently.
|
||||
//
|
||||
// TODO: the comment above about concurrent calls isn't actually true: package
|
||||
// app calls package gl, but it has to do so in a separate goroutine, which
|
||||
// means that its gl calls (which may be blocking) can race with other gl calls
|
||||
// in the main program. We should make it safe to issue blocking gl calls
|
||||
// concurrently, or get the gl calls out of package app, or both.
|
||||
retvalue chan C.uintptr_t
|
||||
|
||||
cargs [workbufLen]C.struct_fnargs
|
||||
parg [workbufLen]*C.char
|
||||
}
|
||||
|
||||
func (ctx *context) WorkAvailable() <-chan struct{} { return ctx.workAvailable }
|
||||
|
||||
type context3 struct {
|
||||
*context
|
||||
}
|
||||
|
||||
// NewContext creates a cgo OpenGL context.
|
||||
//
|
||||
// See the Worker interface for more details on how it is used.
|
||||
func NewContext() (Context, Worker) {
|
||||
glctx := &context{
|
||||
workAvailable: make(chan struct{}, 1),
|
||||
work: make(chan call, workbufLen),
|
||||
retvalue: make(chan C.uintptr_t),
|
||||
}
|
||||
if C.GLES_VERSION == "GL_ES_2_0" {
|
||||
return glctx, glctx
|
||||
}
|
||||
return context3{glctx}, glctx
|
||||
}
|
||||
|
||||
// Version returns a GL ES version string, either "GL_ES_2_0" or "GL_ES_3_0".
|
||||
// Future versions of the gl package may return "GL_ES_3_1".
|
||||
func Version() string {
|
||||
return C.GLES_VERSION
|
||||
}
|
||||
|
||||
func (ctx *context) enqueue(c call) uintptr {
|
||||
ctx.work <- c
|
||||
|
||||
select {
|
||||
case ctx.workAvailable <- struct{}{}:
|
||||
default:
|
||||
}
|
||||
|
||||
if c.blocking {
|
||||
return uintptr(<-ctx.retvalue)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (ctx *context) DoWork() {
|
||||
queue := make([]call, 0, workbufLen)
|
||||
for {
|
||||
// Wait until at least one piece of work is ready.
|
||||
// Accumulate work until a piece is marked as blocking.
|
||||
select {
|
||||
case w := <-ctx.work:
|
||||
queue = append(queue, w)
|
||||
default:
|
||||
return
|
||||
}
|
||||
blocking := queue[len(queue)-1].blocking
|
||||
enqueue:
|
||||
for len(queue) < cap(queue) && !blocking {
|
||||
select {
|
||||
case w := <-ctx.work:
|
||||
queue = append(queue, w)
|
||||
blocking = queue[len(queue)-1].blocking
|
||||
default:
|
||||
break enqueue
|
||||
}
|
||||
}
|
||||
|
||||
// Process the queued GL functions.
|
||||
for i, q := range queue {
|
||||
ctx.cargs[i] = *(*C.struct_fnargs)(unsafe.Pointer(&q.args))
|
||||
ctx.parg[i] = (*C.char)(q.parg)
|
||||
}
|
||||
ret := C.process(&ctx.cargs[0], ctx.parg[0], ctx.parg[1], ctx.parg[2], C.int(len(queue)))
|
||||
|
||||
// Cleanup and signal.
|
||||
queue = queue[:0]
|
||||
if blocking {
|
||||
ctx.retvalue <- ret
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func init() {
|
||||
if unsafe.Sizeof(C.GLint(0)) != unsafe.Sizeof(int32(0)) {
|
||||
panic("GLint is not an int32")
|
||||
}
|
||||
}
|
||||
|
||||
// cString creates C string off the Go heap.
|
||||
// ret is a *char.
|
||||
func (ctx *context) cString(str string) (uintptr, func()) {
|
||||
ptr := unsafe.Pointer(C.CString(str))
|
||||
return uintptr(ptr), func() { C.free(ptr) }
|
||||
}
|
||||
|
||||
// cStringPtr creates a pointer to a C string off the Go heap.
|
||||
// ret is a **char.
|
||||
func (ctx *context) cStringPtr(str string) (uintptr, func()) {
|
||||
s, free := ctx.cString(str)
|
||||
ptr := C.malloc(C.size_t(unsafe.Sizeof((*int)(nil))))
|
||||
*(*uintptr)(ptr) = s
|
||||
return uintptr(ptr), func() {
|
||||
free()
|
||||
C.free(ptr)
|
||||
}
|
||||
}
|
217
gl/work.h
Normal file
217
gl/work.h
Normal file
|
@ -0,0 +1,217 @@
|
|||
// Copyright 2015 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
#ifdef os_android
|
||||
// TODO(crawshaw): We could include <android/api-level.h> and
|
||||
// condition on __ANDROID_API__ to get GLES3 headers. However
|
||||
// we also need to add -lGLESv3 to LDFLAGS, which we cannot do
|
||||
// from inside an ifdef.
|
||||
#include <GLES2/gl2.h>
|
||||
#elif os_linux
|
||||
#include <GLES3/gl3.h> // install on Ubuntu with: sudo apt-get install libegl1-mesa-dev libgles2-mesa-dev libx11-dev
|
||||
#elif os_openbsd
|
||||
#include <GLES3/gl3.h>
|
||||
#endif
|
||||
|
||||
#ifdef os_ios
|
||||
#include <OpenGLES/ES2/glext.h>
|
||||
#endif
|
||||
|
||||
#ifdef os_macos
|
||||
#include <OpenGL/gl3.h>
|
||||
#define GL_ES_VERSION_3_0 1
|
||||
#endif
|
||||
|
||||
#if defined(GL_ES_VERSION_3_0) && GL_ES_VERSION_3_0
|
||||
#define GLES_VERSION "GL_ES_3_0"
|
||||
#else
|
||||
#define GLES_VERSION "GL_ES_2_0"
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
// TODO: generate this enum from fn.go.
|
||||
typedef enum {
|
||||
glfnUNDEFINED,
|
||||
|
||||
glfnActiveTexture,
|
||||
glfnAttachShader,
|
||||
glfnBindAttribLocation,
|
||||
glfnBindBuffer,
|
||||
glfnBindFramebuffer,
|
||||
glfnBindRenderbuffer,
|
||||
glfnBindTexture,
|
||||
glfnBindVertexArray,
|
||||
glfnBlendColor,
|
||||
glfnBlendEquation,
|
||||
glfnBlendEquationSeparate,
|
||||
glfnBlendFunc,
|
||||
glfnBlendFuncSeparate,
|
||||
glfnBufferData,
|
||||
glfnBufferSubData,
|
||||
glfnCheckFramebufferStatus,
|
||||
glfnClear,
|
||||
glfnClearColor,
|
||||
glfnClearDepthf,
|
||||
glfnClearStencil,
|
||||
glfnColorMask,
|
||||
glfnCompileShader,
|
||||
glfnCompressedTexImage2D,
|
||||
glfnCompressedTexSubImage2D,
|
||||
glfnCopyTexImage2D,
|
||||
glfnCopyTexSubImage2D,
|
||||
glfnCreateProgram,
|
||||
glfnCreateShader,
|
||||
glfnCullFace,
|
||||
glfnDeleteBuffer,
|
||||
glfnDeleteFramebuffer,
|
||||
glfnDeleteProgram,
|
||||
glfnDeleteRenderbuffer,
|
||||
glfnDeleteShader,
|
||||
glfnDeleteTexture,
|
||||
glfnDeleteVertexArray,
|
||||
glfnDepthFunc,
|
||||
glfnDepthRangef,
|
||||
glfnDepthMask,
|
||||
glfnDetachShader,
|
||||
glfnDisable,
|
||||
glfnDisableVertexAttribArray,
|
||||
glfnDrawArrays,
|
||||
glfnDrawElements,
|
||||
glfnEnable,
|
||||
glfnEnableVertexAttribArray,
|
||||
glfnFinish,
|
||||
glfnFlush,
|
||||
glfnFramebufferRenderbuffer,
|
||||
glfnFramebufferTexture2D,
|
||||
glfnFrontFace,
|
||||
glfnGenBuffer,
|
||||
glfnGenFramebuffer,
|
||||
glfnGenRenderbuffer,
|
||||
glfnGenTexture,
|
||||
glfnGenVertexArray,
|
||||
glfnGenerateMipmap,
|
||||
glfnGetActiveAttrib,
|
||||
glfnGetActiveUniform,
|
||||
glfnGetAttachedShaders,
|
||||
glfnGetAttribLocation,
|
||||
glfnGetBooleanv,
|
||||
glfnGetBufferParameteri,
|
||||
glfnGetError,
|
||||
glfnGetFloatv,
|
||||
glfnGetFramebufferAttachmentParameteriv,
|
||||
glfnGetIntegerv,
|
||||
glfnGetProgramInfoLog,
|
||||
glfnGetProgramiv,
|
||||
glfnGetRenderbufferParameteriv,
|
||||
glfnGetShaderInfoLog,
|
||||
glfnGetShaderPrecisionFormat,
|
||||
glfnGetShaderSource,
|
||||
glfnGetShaderiv,
|
||||
glfnGetString,
|
||||
glfnGetTexParameterfv,
|
||||
glfnGetTexParameteriv,
|
||||
glfnGetUniformLocation,
|
||||
glfnGetUniformfv,
|
||||
glfnGetUniformiv,
|
||||
glfnGetVertexAttribfv,
|
||||
glfnGetVertexAttribiv,
|
||||
glfnHint,
|
||||
glfnIsBuffer,
|
||||
glfnIsEnabled,
|
||||
glfnIsFramebuffer,
|
||||
glfnIsProgram,
|
||||
glfnIsRenderbuffer,
|
||||
glfnIsShader,
|
||||
glfnIsTexture,
|
||||
glfnLineWidth,
|
||||
glfnLinkProgram,
|
||||
glfnPixelStorei,
|
||||
glfnPolygonOffset,
|
||||
glfnReadPixels,
|
||||
glfnReleaseShaderCompiler,
|
||||
glfnRenderbufferStorage,
|
||||
glfnSampleCoverage,
|
||||
glfnScissor,
|
||||
glfnShaderSource,
|
||||
glfnStencilFunc,
|
||||
glfnStencilFuncSeparate,
|
||||
glfnStencilMask,
|
||||
glfnStencilMaskSeparate,
|
||||
glfnStencilOp,
|
||||
glfnStencilOpSeparate,
|
||||
glfnTexImage2D,
|
||||
glfnTexParameterf,
|
||||
glfnTexParameterfv,
|
||||
glfnTexParameteri,
|
||||
glfnTexParameteriv,
|
||||
glfnTexSubImage2D,
|
||||
glfnUniform1f,
|
||||
glfnUniform1fv,
|
||||
glfnUniform1i,
|
||||
glfnUniform1iv,
|
||||
glfnUniform2f,
|
||||
glfnUniform2fv,
|
||||
glfnUniform2i,
|
||||
glfnUniform2iv,
|
||||
glfnUniform3f,
|
||||
glfnUniform3fv,
|
||||
glfnUniform3i,
|
||||
glfnUniform3iv,
|
||||
glfnUniform4f,
|
||||
glfnUniform4fv,
|
||||
glfnUniform4i,
|
||||
glfnUniform4iv,
|
||||
glfnUniformMatrix2fv,
|
||||
glfnUniformMatrix3fv,
|
||||
glfnUniformMatrix4fv,
|
||||
glfnUseProgram,
|
||||
glfnValidateProgram,
|
||||
glfnVertexAttrib1f,
|
||||
glfnVertexAttrib1fv,
|
||||
glfnVertexAttrib2f,
|
||||
glfnVertexAttrib2fv,
|
||||
glfnVertexAttrib3f,
|
||||
glfnVertexAttrib3fv,
|
||||
glfnVertexAttrib4f,
|
||||
glfnVertexAttrib4fv,
|
||||
glfnVertexAttribPointer,
|
||||
glfnViewport,
|
||||
|
||||
// ES 3.0 functions
|
||||
glfnUniformMatrix2x3fv,
|
||||
glfnUniformMatrix3x2fv,
|
||||
glfnUniformMatrix2x4fv,
|
||||
glfnUniformMatrix4x2fv,
|
||||
glfnUniformMatrix3x4fv,
|
||||
glfnUniformMatrix4x3fv,
|
||||
glfnBlitFramebuffer,
|
||||
glfnUniform1ui,
|
||||
glfnUniform2ui,
|
||||
glfnUniform3ui,
|
||||
glfnUniform4ui,
|
||||
glfnUniform1uiv,
|
||||
glfnUniform2uiv,
|
||||
glfnUniform3uiv,
|
||||
glfnUniform4uiv,
|
||||
} glfn;
|
||||
|
||||
// TODO: generate this type from fn.go.
|
||||
struct fnargs {
|
||||
glfn fn;
|
||||
|
||||
uintptr_t a0;
|
||||
uintptr_t a1;
|
||||
uintptr_t a2;
|
||||
uintptr_t a3;
|
||||
uintptr_t a4;
|
||||
uintptr_t a5;
|
||||
uintptr_t a6;
|
||||
uintptr_t a7;
|
||||
uintptr_t a8;
|
||||
uintptr_t a9;
|
||||
};
|
||||
|
||||
extern uintptr_t processFn(struct fnargs* args, char* parg);
|
35
gl/work_other.go
Normal file
35
gl/work_other.go
Normal file
|
@ -0,0 +1,35 @@
|
|||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build (!cgo || (!darwin && !linux && !openbsd)) && !windows
|
||||
|
||||
package gl
|
||||
|
||||
// This file contains stub implementations of what the other work*.go files
|
||||
// provide. These stubs don't do anything, other than compile (e.g. when cgo is
|
||||
// disabled).
|
||||
|
||||
type context struct{}
|
||||
|
||||
func (*context) enqueue(c call) uintptr {
|
||||
panic("unimplemented; GOOS/CGO combination not supported")
|
||||
}
|
||||
|
||||
func (*context) cString(str string) (uintptr, func()) {
|
||||
panic("unimplemented; GOOS/CGO combination not supported")
|
||||
}
|
||||
|
||||
func (*context) cStringPtr(str string) (uintptr, func()) {
|
||||
panic("unimplemented; GOOS/CGO combination not supported")
|
||||
}
|
||||
|
||||
type context3 = context
|
||||
|
||||
func NewContext() (Context, Worker) {
|
||||
panic("unimplemented; GOOS/CGO combination not supported")
|
||||
}
|
||||
|
||||
func Version() string {
|
||||
panic("unimplemented; GOOS/CGO combination not supported")
|
||||
}
|
569
gl/work_windows.go
Normal file
569
gl/work_windows.go
Normal file
|
@ -0,0 +1,569 @@
|
|||
// Copyright 2015 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package gl
|
||||
|
||||
import (
|
||||
"runtime"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
// context is described in work.go.
|
||||
type context struct {
|
||||
debug int32
|
||||
workAvailable chan struct{}
|
||||
work chan call
|
||||
retvalue chan uintptr
|
||||
|
||||
// TODO(crawshaw): will not work with a moving collector
|
||||
cStringCounter int
|
||||
cStrings map[int]unsafe.Pointer
|
||||
}
|
||||
|
||||
func (ctx *context) WorkAvailable() <-chan struct{} { return ctx.workAvailable }
|
||||
|
||||
type context3 struct {
|
||||
*context
|
||||
}
|
||||
|
||||
func NewContext() (Context, Worker) {
|
||||
if err := findDLLs(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
glctx := &context{
|
||||
workAvailable: make(chan struct{}, 1),
|
||||
work: make(chan call, 3),
|
||||
retvalue: make(chan uintptr),
|
||||
cStrings: make(map[int]unsafe.Pointer),
|
||||
}
|
||||
return glctx, glctx
|
||||
}
|
||||
|
||||
func (ctx *context) enqueue(c call) uintptr {
|
||||
ctx.work <- c
|
||||
|
||||
select {
|
||||
case ctx.workAvailable <- struct{}{}:
|
||||
default:
|
||||
}
|
||||
|
||||
if c.blocking {
|
||||
return <-ctx.retvalue
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (ctx *context) DoWork() {
|
||||
// TODO: add a work queue
|
||||
for {
|
||||
select {
|
||||
case w := <-ctx.work:
|
||||
ret := ctx.doWork(w)
|
||||
if w.blocking {
|
||||
ctx.retvalue <- ret
|
||||
}
|
||||
default:
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (ctx *context) cString(s string) (uintptr, func()) {
|
||||
buf := make([]byte, len(s)+1)
|
||||
for i := 0; i < len(s); i++ {
|
||||
buf[i] = s[i]
|
||||
}
|
||||
ret := unsafe.Pointer(&buf[0])
|
||||
id := ctx.cStringCounter
|
||||
ctx.cStringCounter++
|
||||
ctx.cStrings[id] = ret
|
||||
return uintptr(ret), func() { delete(ctx.cStrings, id) }
|
||||
}
|
||||
|
||||
func (ctx *context) cStringPtr(str string) (uintptr, func()) {
|
||||
s, sfree := ctx.cString(str)
|
||||
sptr := [2]uintptr{s, 0}
|
||||
ret := unsafe.Pointer(&sptr[0])
|
||||
id := ctx.cStringCounter
|
||||
ctx.cStringCounter++
|
||||
ctx.cStrings[id] = ret
|
||||
return uintptr(ret), func() { sfree(); delete(ctx.cStrings, id) }
|
||||
}
|
||||
|
||||
// fixFloat copies the first four arguments into the XMM registers.
|
||||
// This is for the windows/amd64 calling convention, that wants
|
||||
// floating point arguments to be passed in XMM.
|
||||
//
|
||||
// Mercifully, type information is not required to implement
|
||||
// this calling convention. In particular see the mixed int/float
|
||||
// examples:
|
||||
//
|
||||
// https://msdn.microsoft.com/en-us/library/zthk2dkh.aspx
|
||||
//
|
||||
// This means it could be fixed in syscall.Syscall. The relevant
|
||||
// issue is
|
||||
//
|
||||
// https://golang.org/issue/6510
|
||||
func fixFloat(x0, x1, x2, x3 uintptr)
|
||||
|
||||
func (ctx *context) doWork(c call) (ret uintptr) {
|
||||
if runtime.GOARCH == "amd64" {
|
||||
fixFloat(c.args.a0, c.args.a1, c.args.a2, c.args.a3)
|
||||
}
|
||||
|
||||
switch c.args.fn {
|
||||
case glfnActiveTexture:
|
||||
syscall.Syscall(glActiveTexture.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnAttachShader:
|
||||
syscall.Syscall(glAttachShader.Addr(), 2, c.args.a0, c.args.a1, 0)
|
||||
case glfnBindAttribLocation:
|
||||
syscall.Syscall(glBindAttribLocation.Addr(), 3, c.args.a0, c.args.a1, c.args.a2)
|
||||
case glfnBindBuffer:
|
||||
syscall.Syscall(glBindBuffer.Addr(), 2, c.args.a0, c.args.a1, 0)
|
||||
case glfnBindFramebuffer:
|
||||
syscall.Syscall(glBindFramebuffer.Addr(), 2, c.args.a0, c.args.a1, 0)
|
||||
case glfnBindRenderbuffer:
|
||||
syscall.Syscall(glBindRenderbuffer.Addr(), 2, c.args.a0, c.args.a1, 0)
|
||||
case glfnBindTexture:
|
||||
syscall.Syscall(glBindTexture.Addr(), 2, c.args.a0, c.args.a1, 0)
|
||||
case glfnBindVertexArray:
|
||||
syscall.Syscall(glBindVertexArray.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnBlendColor:
|
||||
syscall.Syscall6(glBlendColor.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
|
||||
case glfnBlendEquation:
|
||||
syscall.Syscall(glBlendEquation.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnBlendEquationSeparate:
|
||||
syscall.Syscall(glBlendEquationSeparate.Addr(), 2, c.args.a0, c.args.a1, 0)
|
||||
case glfnBlendFunc:
|
||||
syscall.Syscall(glBlendFunc.Addr(), 2, c.args.a0, c.args.a1, 0)
|
||||
case glfnBlendFuncSeparate:
|
||||
syscall.Syscall6(glBlendFuncSeparate.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
|
||||
case glfnBufferData:
|
||||
syscall.Syscall6(glBufferData.Addr(), 4, c.args.a0, c.args.a1, uintptr(c.parg), c.args.a2, 0, 0)
|
||||
case glfnBufferSubData:
|
||||
syscall.Syscall6(glBufferSubData.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, uintptr(c.parg), 0, 0)
|
||||
case glfnCheckFramebufferStatus:
|
||||
ret, _, _ = syscall.Syscall(glCheckFramebufferStatus.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnClear:
|
||||
syscall.Syscall(glClear.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnClearColor:
|
||||
syscall.Syscall6(glClearColor.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
|
||||
case glfnClearDepthf:
|
||||
syscall.Syscall6(glClearDepthf.Addr(), 1, c.args.a0, 0, 0, 0, 0, 0)
|
||||
case glfnClearStencil:
|
||||
syscall.Syscall(glClearStencil.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnColorMask:
|
||||
syscall.Syscall6(glColorMask.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
|
||||
case glfnCompileShader:
|
||||
syscall.Syscall(glCompileShader.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnCompressedTexImage2D:
|
||||
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)
|
||||
case glfnCompressedTexSubImage2D:
|
||||
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))
|
||||
case glfnCopyTexImage2D:
|
||||
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)
|
||||
case glfnCopyTexSubImage2D:
|
||||
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)
|
||||
case glfnCreateProgram:
|
||||
ret, _, _ = syscall.Syscall(glCreateProgram.Addr(), 0, 0, 0, 0)
|
||||
case glfnCreateShader:
|
||||
ret, _, _ = syscall.Syscall(glCreateShader.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnCullFace:
|
||||
syscall.Syscall(glCullFace.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnDeleteBuffer:
|
||||
syscall.Syscall(glDeleteBuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&c.args.a0)), 0)
|
||||
case glfnDeleteFramebuffer:
|
||||
syscall.Syscall(glDeleteFramebuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&c.args.a0)), 0)
|
||||
case glfnDeleteProgram:
|
||||
syscall.Syscall(glDeleteProgram.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnDeleteRenderbuffer:
|
||||
syscall.Syscall(glDeleteRenderbuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&c.args.a0)), 0)
|
||||
case glfnDeleteShader:
|
||||
syscall.Syscall(glDeleteShader.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnDeleteVertexArray:
|
||||
syscall.Syscall(glDeleteVertexArrays.Addr(), 2, 1, uintptr(unsafe.Pointer(&c.args.a0)), 0)
|
||||
case glfnDeleteTexture:
|
||||
syscall.Syscall(glDeleteTextures.Addr(), 2, 1, uintptr(unsafe.Pointer(&c.args.a0)), 0)
|
||||
case glfnDepthFunc:
|
||||
syscall.Syscall(glDepthFunc.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnDepthRangef:
|
||||
syscall.Syscall6(glDepthRangef.Addr(), 2, c.args.a0, c.args.a1, 0, 0, 0, 0)
|
||||
case glfnDepthMask:
|
||||
syscall.Syscall(glDepthMask.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnDetachShader:
|
||||
syscall.Syscall(glDetachShader.Addr(), 2, c.args.a0, c.args.a1, 0)
|
||||
case glfnDisable:
|
||||
syscall.Syscall(glDisable.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnDisableVertexAttribArray:
|
||||
syscall.Syscall(glDisableVertexAttribArray.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnDrawArrays:
|
||||
syscall.Syscall(glDrawArrays.Addr(), 3, c.args.a0, c.args.a1, c.args.a2)
|
||||
case glfnDrawElements:
|
||||
syscall.Syscall6(glDrawElements.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
|
||||
case glfnEnable:
|
||||
syscall.Syscall(glEnable.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnEnableVertexAttribArray:
|
||||
syscall.Syscall(glEnableVertexAttribArray.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnFinish:
|
||||
syscall.Syscall(glFinish.Addr(), 0, 0, 0, 0)
|
||||
case glfnFlush:
|
||||
syscall.Syscall(glFlush.Addr(), 0, 0, 0, 0)
|
||||
case glfnFramebufferRenderbuffer:
|
||||
syscall.Syscall6(glFramebufferRenderbuffer.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
|
||||
case glfnFramebufferTexture2D:
|
||||
syscall.Syscall6(glFramebufferTexture2D.Addr(), 5, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, 0)
|
||||
case glfnFrontFace:
|
||||
syscall.Syscall(glFrontFace.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnGenBuffer:
|
||||
syscall.Syscall(glGenBuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&ret)), 0)
|
||||
case glfnGenFramebuffer:
|
||||
syscall.Syscall(glGenFramebuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&ret)), 0)
|
||||
case glfnGenRenderbuffer:
|
||||
syscall.Syscall(glGenRenderbuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&ret)), 0)
|
||||
case glfnGenVertexArray:
|
||||
syscall.Syscall(glGenVertexArrays.Addr(), 2, 1, uintptr(unsafe.Pointer(&ret)), 0)
|
||||
case glfnGenTexture:
|
||||
syscall.Syscall(glGenTextures.Addr(), 2, 1, uintptr(unsafe.Pointer(&ret)), 0)
|
||||
case glfnGenerateMipmap:
|
||||
syscall.Syscall(glGenerateMipmap.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnGetActiveAttrib:
|
||||
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)
|
||||
case glfnGetActiveUniform:
|
||||
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)
|
||||
case glfnGetAttachedShaders:
|
||||
syscall.Syscall6(glGetAttachedShaders.Addr(), 4, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret)), uintptr(c.parg), 0, 0)
|
||||
case glfnGetAttribLocation:
|
||||
ret, _, _ = syscall.Syscall(glGetAttribLocation.Addr(), 2, c.args.a0, c.args.a1, 0)
|
||||
case glfnGetBooleanv:
|
||||
syscall.Syscall(glGetBooleanv.Addr(), 2, c.args.a0, uintptr(c.parg), 0)
|
||||
case glfnGetBufferParameteri:
|
||||
syscall.Syscall(glGetBufferParameteri.Addr(), 3, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret)))
|
||||
case glfnGetError:
|
||||
ret, _, _ = syscall.Syscall(glGetError.Addr(), 0, 0, 0, 0)
|
||||
case glfnGetFloatv:
|
||||
syscall.Syscall(glGetFloatv.Addr(), 2, c.args.a0, uintptr(c.parg), 0)
|
||||
case glfnGetFramebufferAttachmentParameteriv:
|
||||
syscall.Syscall6(glGetFramebufferAttachmentParameteriv.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, uintptr(unsafe.Pointer(&ret)), 0, 0)
|
||||
case glfnGetIntegerv:
|
||||
syscall.Syscall(glGetIntegerv.Addr(), 2, c.args.a0, uintptr(c.parg), 0)
|
||||
case glfnGetProgramInfoLog:
|
||||
syscall.Syscall6(glGetProgramInfoLog.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0)
|
||||
case glfnGetProgramiv:
|
||||
syscall.Syscall(glGetProgramiv.Addr(), 3, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret)))
|
||||
case glfnGetRenderbufferParameteriv:
|
||||
syscall.Syscall(glGetRenderbufferParameteriv.Addr(), 3, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret)))
|
||||
case glfnGetShaderInfoLog:
|
||||
syscall.Syscall6(glGetShaderInfoLog.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0)
|
||||
case glfnGetShaderPrecisionFormat:
|
||||
// c.parg is a [3]int32. The first [2]int32 of the array is one
|
||||
// parameter, the final *int32 is another parameter.
|
||||
syscall.Syscall6(glGetShaderPrecisionFormat.Addr(), 4, c.args.a0, c.args.a1, uintptr(c.parg), uintptr(c.parg)+2*unsafe.Sizeof(uintptr(0)), 0, 0)
|
||||
case glfnGetShaderSource:
|
||||
syscall.Syscall6(glGetShaderSource.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0)
|
||||
case glfnGetShaderiv:
|
||||
syscall.Syscall(glGetShaderiv.Addr(), 3, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret)))
|
||||
case glfnGetString:
|
||||
ret, _, _ = syscall.Syscall(glGetString.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnGetTexParameterfv:
|
||||
syscall.Syscall(glGetTexParameterfv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
|
||||
case glfnGetTexParameteriv:
|
||||
syscall.Syscall(glGetTexParameteriv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
|
||||
case glfnGetUniformLocation:
|
||||
ret, _, _ = syscall.Syscall(glGetUniformLocation.Addr(), 2, c.args.a0, c.args.a1, 0)
|
||||
case glfnGetUniformfv:
|
||||
syscall.Syscall(glGetUniformfv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
|
||||
case glfnGetUniformiv:
|
||||
syscall.Syscall(glGetUniformiv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
|
||||
case glfnGetVertexAttribfv:
|
||||
syscall.Syscall(glGetVertexAttribfv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
|
||||
case glfnGetVertexAttribiv:
|
||||
syscall.Syscall(glGetVertexAttribiv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
|
||||
case glfnHint:
|
||||
syscall.Syscall(glHint.Addr(), 2, c.args.a0, c.args.a1, 0)
|
||||
case glfnIsBuffer:
|
||||
syscall.Syscall(glIsBuffer.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnIsEnabled:
|
||||
syscall.Syscall(glIsEnabled.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnIsFramebuffer:
|
||||
syscall.Syscall(glIsFramebuffer.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnIsProgram:
|
||||
ret, _, _ = syscall.Syscall(glIsProgram.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnIsRenderbuffer:
|
||||
syscall.Syscall(glIsRenderbuffer.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnIsShader:
|
||||
syscall.Syscall(glIsShader.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnIsTexture:
|
||||
syscall.Syscall(glIsTexture.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnLineWidth:
|
||||
syscall.Syscall(glLineWidth.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnLinkProgram:
|
||||
syscall.Syscall(glLinkProgram.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnPixelStorei:
|
||||
syscall.Syscall(glPixelStorei.Addr(), 2, c.args.a0, c.args.a1, 0)
|
||||
case glfnPolygonOffset:
|
||||
syscall.Syscall6(glPolygonOffset.Addr(), 2, c.args.a0, c.args.a1, 0, 0, 0, 0)
|
||||
case glfnReadPixels:
|
||||
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)
|
||||
case glfnReleaseShaderCompiler:
|
||||
syscall.Syscall(glReleaseShaderCompiler.Addr(), 0, 0, 0, 0)
|
||||
case glfnRenderbufferStorage:
|
||||
syscall.Syscall6(glRenderbufferStorage.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
|
||||
case glfnSampleCoverage:
|
||||
syscall.Syscall6(glSampleCoverage.Addr(), 1, c.args.a0, 0, 0, 0, 0, 0)
|
||||
case glfnScissor:
|
||||
syscall.Syscall6(glScissor.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
|
||||
case glfnShaderSource:
|
||||
syscall.Syscall6(glShaderSource.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, 0, 0, 0)
|
||||
case glfnStencilFunc:
|
||||
syscall.Syscall(glStencilFunc.Addr(), 3, c.args.a0, c.args.a1, c.args.a2)
|
||||
case glfnStencilFuncSeparate:
|
||||
syscall.Syscall6(glStencilFuncSeparate.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
|
||||
case glfnStencilMask:
|
||||
syscall.Syscall(glStencilMask.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnStencilMaskSeparate:
|
||||
syscall.Syscall(glStencilMaskSeparate.Addr(), 2, c.args.a0, c.args.a1, 0)
|
||||
case glfnStencilOp:
|
||||
syscall.Syscall(glStencilOp.Addr(), 3, c.args.a0, c.args.a1, c.args.a2)
|
||||
case glfnStencilOpSeparate:
|
||||
syscall.Syscall6(glStencilOpSeparate.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
|
||||
case glfnTexImage2D:
|
||||
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))
|
||||
case glfnTexParameterf:
|
||||
syscall.Syscall6(glTexParameterf.Addr(), 3, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
|
||||
case glfnTexParameterfv:
|
||||
syscall.Syscall(glTexParameterfv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
|
||||
case glfnTexParameteri:
|
||||
syscall.Syscall(glTexParameteri.Addr(), 3, c.args.a0, c.args.a1, c.args.a2)
|
||||
case glfnTexParameteriv:
|
||||
syscall.Syscall(glTexParameteriv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
|
||||
case glfnTexSubImage2D:
|
||||
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))
|
||||
case glfnUniform1f:
|
||||
syscall.Syscall6(glUniform1f.Addr(), 2, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
|
||||
case glfnUniform1fv:
|
||||
syscall.Syscall(glUniform1fv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
|
||||
case glfnUniform1i:
|
||||
syscall.Syscall(glUniform1i.Addr(), 2, c.args.a0, c.args.a1, 0)
|
||||
case glfnUniform1iv:
|
||||
syscall.Syscall(glUniform1iv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
|
||||
case glfnUniform2f:
|
||||
syscall.Syscall6(glUniform2f.Addr(), 3, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
|
||||
case glfnUniform2fv:
|
||||
syscall.Syscall(glUniform2fv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
|
||||
case glfnUniform2i:
|
||||
syscall.Syscall(glUniform2i.Addr(), 3, c.args.a0, c.args.a1, c.args.a2)
|
||||
case glfnUniform2iv:
|
||||
syscall.Syscall(glUniform2iv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
|
||||
case glfnUniform3f:
|
||||
syscall.Syscall6(glUniform3f.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
|
||||
case glfnUniform3fv:
|
||||
syscall.Syscall(glUniform3fv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
|
||||
case glfnUniform3i:
|
||||
syscall.Syscall6(glUniform3i.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
|
||||
case glfnUniform3iv:
|
||||
syscall.Syscall(glUniform3iv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
|
||||
case glfnUniform4f:
|
||||
syscall.Syscall6(glUniform4f.Addr(), 5, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
|
||||
case glfnUniform4fv:
|
||||
syscall.Syscall(glUniform4fv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
|
||||
case glfnUniform4i:
|
||||
syscall.Syscall6(glUniform4i.Addr(), 5, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, 0)
|
||||
case glfnUniform4iv:
|
||||
syscall.Syscall(glUniform4iv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg))
|
||||
case glfnUniformMatrix2fv:
|
||||
syscall.Syscall6(glUniformMatrix2fv.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0)
|
||||
case glfnUniformMatrix3fv:
|
||||
syscall.Syscall6(glUniformMatrix3fv.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0)
|
||||
case glfnUniformMatrix4fv:
|
||||
syscall.Syscall6(glUniformMatrix4fv.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0)
|
||||
case glfnUseProgram:
|
||||
syscall.Syscall(glUseProgram.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnValidateProgram:
|
||||
syscall.Syscall(glValidateProgram.Addr(), 1, c.args.a0, 0, 0)
|
||||
case glfnVertexAttrib1f:
|
||||
syscall.Syscall6(glVertexAttrib1f.Addr(), 2, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
|
||||
case glfnVertexAttrib1fv:
|
||||
syscall.Syscall(glVertexAttrib1fv.Addr(), 2, c.args.a0, uintptr(c.parg), 0)
|
||||
case glfnVertexAttrib2f:
|
||||
syscall.Syscall6(glVertexAttrib2f.Addr(), 3, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
|
||||
case glfnVertexAttrib2fv:
|
||||
syscall.Syscall(glVertexAttrib2fv.Addr(), 2, c.args.a0, uintptr(c.parg), 0)
|
||||
case glfnVertexAttrib3f:
|
||||
syscall.Syscall6(glVertexAttrib3f.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
|
||||
case glfnVertexAttrib3fv:
|
||||
syscall.Syscall(glVertexAttrib3fv.Addr(), 2, c.args.a0, uintptr(c.parg), 0)
|
||||
case glfnVertexAttrib4f:
|
||||
syscall.Syscall6(glVertexAttrib4f.Addr(), 5, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
|
||||
case glfnVertexAttrib4fv:
|
||||
syscall.Syscall(glVertexAttrib4fv.Addr(), 2, c.args.a0, uintptr(c.parg), 0)
|
||||
case glfnVertexAttribPointer:
|
||||
syscall.Syscall6(glVertexAttribPointer.Addr(), 6, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5)
|
||||
case glfnViewport:
|
||||
syscall.Syscall6(glViewport.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0)
|
||||
default:
|
||||
panic("unknown GL function")
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
// Exported libraries for a Windows GUI driver.
|
||||
//
|
||||
// LibEGL is not used directly by the gl package, but is needed by any
|
||||
// driver hoping to use OpenGL ES.
|
||||
//
|
||||
// LibD3DCompiler is needed by libglesv2.dll for compiling shaders.
|
||||
var (
|
||||
LibGLESv2 = syscall.NewLazyDLL("libglesv2.dll")
|
||||
LibEGL = syscall.NewLazyDLL("libegl.dll")
|
||||
LibD3DCompiler = syscall.NewLazyDLL("d3dcompiler_47.dll")
|
||||
)
|
||||
|
||||
var (
|
||||
libGLESv2 = LibGLESv2
|
||||
glActiveTexture = libGLESv2.NewProc("glActiveTexture")
|
||||
glAttachShader = libGLESv2.NewProc("glAttachShader")
|
||||
glBindAttribLocation = libGLESv2.NewProc("glBindAttribLocation")
|
||||
glBindBuffer = libGLESv2.NewProc("glBindBuffer")
|
||||
glBindFramebuffer = libGLESv2.NewProc("glBindFramebuffer")
|
||||
glBindRenderbuffer = libGLESv2.NewProc("glBindRenderbuffer")
|
||||
glBindTexture = libGLESv2.NewProc("glBindTexture")
|
||||
glBindVertexArray = libGLESv2.NewProc("glBindVertexArray")
|
||||
glBlendColor = libGLESv2.NewProc("glBlendColor")
|
||||
glBlendEquation = libGLESv2.NewProc("glBlendEquation")
|
||||
glBlendEquationSeparate = libGLESv2.NewProc("glBlendEquationSeparate")
|
||||
glBlendFunc = libGLESv2.NewProc("glBlendFunc")
|
||||
glBlendFuncSeparate = libGLESv2.NewProc("glBlendFuncSeparate")
|
||||
glBufferData = libGLESv2.NewProc("glBufferData")
|
||||
glBufferSubData = libGLESv2.NewProc("glBufferSubData")
|
||||
glCheckFramebufferStatus = libGLESv2.NewProc("glCheckFramebufferStatus")
|
||||
glClear = libGLESv2.NewProc("glClear")
|
||||
glClearColor = libGLESv2.NewProc("glClearColor")
|
||||
glClearDepthf = libGLESv2.NewProc("glClearDepthf")
|
||||
glClearStencil = libGLESv2.NewProc("glClearStencil")
|
||||
glColorMask = libGLESv2.NewProc("glColorMask")
|
||||
glCompileShader = libGLESv2.NewProc("glCompileShader")
|
||||
glCompressedTexImage2D = libGLESv2.NewProc("glCompressedTexImage2D")
|
||||
glCompressedTexSubImage2D = libGLESv2.NewProc("glCompressedTexSubImage2D")
|
||||
glCopyTexImage2D = libGLESv2.NewProc("glCopyTexImage2D")
|
||||
glCopyTexSubImage2D = libGLESv2.NewProc("glCopyTexSubImage2D")
|
||||
glCreateProgram = libGLESv2.NewProc("glCreateProgram")
|
||||
glCreateShader = libGLESv2.NewProc("glCreateShader")
|
||||
glCullFace = libGLESv2.NewProc("glCullFace")
|
||||
glDeleteBuffers = libGLESv2.NewProc("glDeleteBuffers")
|
||||
glDeleteFramebuffers = libGLESv2.NewProc("glDeleteFramebuffers")
|
||||
glDeleteProgram = libGLESv2.NewProc("glDeleteProgram")
|
||||
glDeleteRenderbuffers = libGLESv2.NewProc("glDeleteRenderbuffers")
|
||||
glDeleteShader = libGLESv2.NewProc("glDeleteShader")
|
||||
glDeleteTextures = libGLESv2.NewProc("glDeleteTextures")
|
||||
glDeleteVertexArrays = libGLESv2.NewProc("glDeleteVertexArrays")
|
||||
glDepthFunc = libGLESv2.NewProc("glDepthFunc")
|
||||
glDepthRangef = libGLESv2.NewProc("glDepthRangef")
|
||||
glDepthMask = libGLESv2.NewProc("glDepthMask")
|
||||
glDetachShader = libGLESv2.NewProc("glDetachShader")
|
||||
glDisable = libGLESv2.NewProc("glDisable")
|
||||
glDisableVertexAttribArray = libGLESv2.NewProc("glDisableVertexAttribArray")
|
||||
glDrawArrays = libGLESv2.NewProc("glDrawArrays")
|
||||
glDrawElements = libGLESv2.NewProc("glDrawElements")
|
||||
glEnable = libGLESv2.NewProc("glEnable")
|
||||
glEnableVertexAttribArray = libGLESv2.NewProc("glEnableVertexAttribArray")
|
||||
glFinish = libGLESv2.NewProc("glFinish")
|
||||
glFlush = libGLESv2.NewProc("glFlush")
|
||||
glFramebufferRenderbuffer = libGLESv2.NewProc("glFramebufferRenderbuffer")
|
||||
glFramebufferTexture2D = libGLESv2.NewProc("glFramebufferTexture2D")
|
||||
glFrontFace = libGLESv2.NewProc("glFrontFace")
|
||||
glGenBuffers = libGLESv2.NewProc("glGenBuffers")
|
||||
glGenFramebuffers = libGLESv2.NewProc("glGenFramebuffers")
|
||||
glGenRenderbuffers = libGLESv2.NewProc("glGenRenderbuffers")
|
||||
glGenTextures = libGLESv2.NewProc("glGenTextures")
|
||||
glGenVertexArrays = libGLESv2.NewProc("glGenVertexArrays")
|
||||
glGenerateMipmap = libGLESv2.NewProc("glGenerateMipmap")
|
||||
glGetActiveAttrib = libGLESv2.NewProc("glGetActiveAttrib")
|
||||
glGetActiveUniform = libGLESv2.NewProc("glGetActiveUniform")
|
||||
glGetAttachedShaders = libGLESv2.NewProc("glGetAttachedShaders")
|
||||
glGetAttribLocation = libGLESv2.NewProc("glGetAttribLocation")
|
||||
glGetBooleanv = libGLESv2.NewProc("glGetBooleanv")
|
||||
glGetBufferParameteri = libGLESv2.NewProc("glGetBufferParameteri")
|
||||
glGetError = libGLESv2.NewProc("glGetError")
|
||||
glGetFloatv = libGLESv2.NewProc("glGetFloatv")
|
||||
glGetFramebufferAttachmentParameteriv = libGLESv2.NewProc("glGetFramebufferAttachmentParameteriv")
|
||||
glGetIntegerv = libGLESv2.NewProc("glGetIntegerv")
|
||||
glGetProgramInfoLog = libGLESv2.NewProc("glGetProgramInfoLog")
|
||||
glGetProgramiv = libGLESv2.NewProc("glGetProgramiv")
|
||||
glGetRenderbufferParameteriv = libGLESv2.NewProc("glGetRenderbufferParameteriv")
|
||||
glGetShaderInfoLog = libGLESv2.NewProc("glGetShaderInfoLog")
|
||||
glGetShaderPrecisionFormat = libGLESv2.NewProc("glGetShaderPrecisionFormat")
|
||||
glGetShaderSource = libGLESv2.NewProc("glGetShaderSource")
|
||||
glGetShaderiv = libGLESv2.NewProc("glGetShaderiv")
|
||||
glGetString = libGLESv2.NewProc("glGetString")
|
||||
glGetTexParameterfv = libGLESv2.NewProc("glGetTexParameterfv")
|
||||
glGetTexParameteriv = libGLESv2.NewProc("glGetTexParameteriv")
|
||||
glGetUniformLocation = libGLESv2.NewProc("glGetUniformLocation")
|
||||
glGetUniformfv = libGLESv2.NewProc("glGetUniformfv")
|
||||
glGetUniformiv = libGLESv2.NewProc("glGetUniformiv")
|
||||
glGetVertexAttribfv = libGLESv2.NewProc("glGetVertexAttribfv")
|
||||
glGetVertexAttribiv = libGLESv2.NewProc("glGetVertexAttribiv")
|
||||
glHint = libGLESv2.NewProc("glHint")
|
||||
glIsBuffer = libGLESv2.NewProc("glIsBuffer")
|
||||
glIsEnabled = libGLESv2.NewProc("glIsEnabled")
|
||||
glIsFramebuffer = libGLESv2.NewProc("glIsFramebuffer")
|
||||
glIsProgram = libGLESv2.NewProc("glIsProgram")
|
||||
glIsRenderbuffer = libGLESv2.NewProc("glIsRenderbuffer")
|
||||
glIsShader = libGLESv2.NewProc("glIsShader")
|
||||
glIsTexture = libGLESv2.NewProc("glIsTexture")
|
||||
glLineWidth = libGLESv2.NewProc("glLineWidth")
|
||||
glLinkProgram = libGLESv2.NewProc("glLinkProgram")
|
||||
glPixelStorei = libGLESv2.NewProc("glPixelStorei")
|
||||
glPolygonOffset = libGLESv2.NewProc("glPolygonOffset")
|
||||
glReadPixels = libGLESv2.NewProc("glReadPixels")
|
||||
glReleaseShaderCompiler = libGLESv2.NewProc("glReleaseShaderCompiler")
|
||||
glRenderbufferStorage = libGLESv2.NewProc("glRenderbufferStorage")
|
||||
glSampleCoverage = libGLESv2.NewProc("glSampleCoverage")
|
||||
glScissor = libGLESv2.NewProc("glScissor")
|
||||
glShaderSource = libGLESv2.NewProc("glShaderSource")
|
||||
glStencilFunc = libGLESv2.NewProc("glStencilFunc")
|
||||
glStencilFuncSeparate = libGLESv2.NewProc("glStencilFuncSeparate")
|
||||
glStencilMask = libGLESv2.NewProc("glStencilMask")
|
||||
glStencilMaskSeparate = libGLESv2.NewProc("glStencilMaskSeparate")
|
||||
glStencilOp = libGLESv2.NewProc("glStencilOp")
|
||||
glStencilOpSeparate = libGLESv2.NewProc("glStencilOpSeparate")
|
||||
glTexImage2D = libGLESv2.NewProc("glTexImage2D")
|
||||
glTexParameterf = libGLESv2.NewProc("glTexParameterf")
|
||||
glTexParameterfv = libGLESv2.NewProc("glTexParameterfv")
|
||||
glTexParameteri = libGLESv2.NewProc("glTexParameteri")
|
||||
glTexParameteriv = libGLESv2.NewProc("glTexParameteriv")
|
||||
glTexSubImage2D = libGLESv2.NewProc("glTexSubImage2D")
|
||||
glUniform1f = libGLESv2.NewProc("glUniform1f")
|
||||
glUniform1fv = libGLESv2.NewProc("glUniform1fv")
|
||||
glUniform1i = libGLESv2.NewProc("glUniform1i")
|
||||
glUniform1iv = libGLESv2.NewProc("glUniform1iv")
|
||||
glUniform2f = libGLESv2.NewProc("glUniform2f")
|
||||
glUniform2fv = libGLESv2.NewProc("glUniform2fv")
|
||||
glUniform2i = libGLESv2.NewProc("glUniform2i")
|
||||
glUniform2iv = libGLESv2.NewProc("glUniform2iv")
|
||||
glUniform3f = libGLESv2.NewProc("glUniform3f")
|
||||
glUniform3fv = libGLESv2.NewProc("glUniform3fv")
|
||||
glUniform3i = libGLESv2.NewProc("glUniform3i")
|
||||
glUniform3iv = libGLESv2.NewProc("glUniform3iv")
|
||||
glUniform4f = libGLESv2.NewProc("glUniform4f")
|
||||
glUniform4fv = libGLESv2.NewProc("glUniform4fv")
|
||||
glUniform4i = libGLESv2.NewProc("glUniform4i")
|
||||
glUniform4iv = libGLESv2.NewProc("glUniform4iv")
|
||||
glUniformMatrix2fv = libGLESv2.NewProc("glUniformMatrix2fv")
|
||||
glUniformMatrix3fv = libGLESv2.NewProc("glUniformMatrix3fv")
|
||||
glUniformMatrix4fv = libGLESv2.NewProc("glUniformMatrix4fv")
|
||||
glUseProgram = libGLESv2.NewProc("glUseProgram")
|
||||
glValidateProgram = libGLESv2.NewProc("glValidateProgram")
|
||||
glVertexAttrib1f = libGLESv2.NewProc("glVertexAttrib1f")
|
||||
glVertexAttrib1fv = libGLESv2.NewProc("glVertexAttrib1fv")
|
||||
glVertexAttrib2f = libGLESv2.NewProc("glVertexAttrib2f")
|
||||
glVertexAttrib2fv = libGLESv2.NewProc("glVertexAttrib2fv")
|
||||
glVertexAttrib3f = libGLESv2.NewProc("glVertexAttrib3f")
|
||||
glVertexAttrib3fv = libGLESv2.NewProc("glVertexAttrib3fv")
|
||||
glVertexAttrib4f = libGLESv2.NewProc("glVertexAttrib4f")
|
||||
glVertexAttrib4fv = libGLESv2.NewProc("glVertexAttrib4fv")
|
||||
glVertexAttribPointer = libGLESv2.NewProc("glVertexAttribPointer")
|
||||
glViewport = libGLESv2.NewProc("glViewport")
|
||||
)
|
9
gl/work_windows_386.s
Normal file
9
gl/work_windows_386.s
Normal file
|
@ -0,0 +1,9 @@
|
|||
// Copyright 2016 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
#include "textflag.h"
|
||||
|
||||
// fixFloat is unnecessary for windows/386
|
||||
TEXT ·fixFloat(SB),NOSPLIT,$0-16
|
||||
RET
|
12
gl/work_windows_amd64.s
Normal file
12
gl/work_windows_amd64.s
Normal file
|
@ -0,0 +1,12 @@
|
|||
// Copyright 2015 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
#include "textflag.h"
|
||||
|
||||
TEXT ·fixFloat(SB),NOSPLIT,$0-32
|
||||
MOVQ x0+0(FP), X0
|
||||
MOVQ x1+8(FP), X1
|
||||
MOVQ x2+16(FP), X2
|
||||
MOVQ x3+24(FP), X3
|
||||
RET
|
Loading…
Add table
Add a link
Reference in a new issue