| // Copyright (C) 2015 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| import "api/android_extension_pack.api" |
| import "api/asynchronous_queries.api" |
| import "api/buffer_objects.api" |
| import "api/draw_commands.api" |
| import "api/extensions.api" |
| import "api/fragment_operations.api" |
| import "api/framebuffer.api" |
| import "api/glbitfield.api" |
| import "api/glenum.api" |
| import "api/other.api" |
| import "api/programs_and_shaders.api" |
| import "api/rasterization.api" |
| import "api/state_queries.api" |
| import "api/synchronization.api" |
| import "api/textures_and_samplers.api" |
| import "api/transform_feedback.api" |
| import "api/vertex_arrays.api" |
| import "types.api" |
| import "synthetic.api" |
| |
| // HACK: We want to use these types in non-generated code |
| @internal @no_replay |
| class generate_types { |
| u16[] u16_slice |
| u32[] u32_slice |
| } |
| |
| alias map!(GLenum, map!(GLenum, TextureId)) TextureUnitMap |
| |
| extern u32 imageSize(u32 width, u32 height, GLenum format, GLenum type) |
| extern s32 stateVariableSize(GLenum v) |
| macro void minRequiredVersion(u32 major, u32 minor) {} |
| macro void supportsBits(GLbitfield seenBits, GLbitfield validBits) {} |
| macro void requiresExtension(ExtensionId ext) {} |
| macro void glErrorInvalidEnum(GLenum param) {} |
| |
| enum ExtensionId { |
| GL_AMD_performance_monitor = 1 , |
| GL_ANGLE_framebuffer_blit = 2 , |
| GL_ANGLE_framebuffer_multisample = 3 , |
| GL_ANGLE_instanced_arrays = 4 , |
| GL_ANGLE_translated_shader_source = 5 , |
| GL_APPLE_copy_texture_levels = 6 , |
| GL_APPLE_framebuffer_multisample = 7 , |
| GL_APPLE_sync = 8 , |
| GL_EXT_base_instance = 9 , |
| GL_EXT_buffer_storage = 10, |
| GL_EXT_copy_image = 11, |
| GL_EXT_debug_label = 12, |
| GL_EXT_debug_marker = 13, |
| GL_EXT_discard_framebuffer = 14, |
| GL_EXT_disjoint_timer_query = 15, |
| GL_EXT_draw_buffers = 16, |
| GL_EXT_draw_buffers_indexed = 17, |
| GL_EXT_draw_elements_base_vertex = 18, |
| GL_EXT_draw_instanced = 19, |
| GL_EXT_geometry_shader = 20, |
| GL_EXT_instanced_arrays = 21, |
| GL_EXT_map_buffer_range = 22, |
| GL_EXT_multi_draw_arrays = 23, |
| GL_EXT_multi_draw_indirect = 24, |
| GL_EXT_multisampled_render_to_texture = 25, |
| GL_EXT_multiview_draw_buffers = 26, |
| GL_EXT_occlusion_query_boolean = 27, |
| GL_EXT_primitive_bounding_box = 28, |
| GL_EXT_raster_multisample = 29, |
| GL_EXT_robustness = 30, |
| GL_EXT_separate_shader_objects = 31, |
| GL_EXT_sparse_texture = 32, |
| GL_EXT_tessellation_shader = 33, |
| GL_EXT_texture_border_clamp = 34, |
| GL_EXT_texture_buffer = 35, |
| GL_EXT_texture_filter_minmax = 36, |
| GL_EXT_texture_storage = 37, |
| GL_EXT_texture_view = 38, |
| GL_IMG_multisampled_render_to_texture = 39, |
| GL_INTEL_performance_query = 40, |
| GL_KHR_blend_equation_advanced = 41, |
| GL_KHR_debug = 42, |
| GL_KHR_robustness = 43, |
| GL_NV_bindless_texture = 44, |
| GL_NV_blend_equation_advanced = 45, |
| GL_NV_conditional_render = 46, |
| GL_NV_conservative_raster = 47, |
| GL_NV_copy_buffer = 48, |
| GL_NV_coverage_sample = 49, |
| GL_NV_draw_buffers = 50, |
| GL_NV_draw_instanced = 51, |
| GL_NV_fence = 52, |
| GL_NV_fragment_coverage_to_color = 53, |
| GL_NV_framebuffer_blit = 54, |
| GL_NV_framebuffer_mixed_samples = 55, |
| GL_NV_framebuffer_multisample = 56, |
| GL_NV_instanced_arrays = 57, |
| GL_NV_internalformat_sample_query = 58, |
| GL_NV_non_square_matrices = 59, |
| GL_NV_path_rendering = 60, |
| GL_NV_polygon_mode = 61, |
| GL_NV_read_buffer = 62, |
| GL_NV_sample_locations = 63, |
| GL_NV_viewport_array = 64, |
| GL_OES_copy_image = 65, |
| GL_OES_draw_buffers_indexed = 66, |
| GL_OES_draw_elements_base_vertex = 67, |
| GL_OES_EGL_image = 68, |
| GL_OES_geometry_shader = 69, |
| GL_OES_get_program_binary = 70, |
| GL_OES_mapbuffer = 71, |
| GL_OES_primitive_bounding_box = 72, |
| GL_OES_sample_shading = 73, |
| GL_OES_tessellation_shader = 74, |
| GL_OES_texture_3D = 75, |
| GL_OES_texture_border_clamp = 76, |
| GL_OES_texture_buffer = 77, |
| GL_OES_texture_storage_multisample_2d_array = 78, |
| GL_OES_texture_view = 79, |
| GL_OES_vertex_array_object = 80, |
| GL_OVR_multiview = 81, |
| GL_QCOM_alpha_test = 82, |
| GL_QCOM_driver_control = 83, |
| GL_QCOM_extended_get = 84, |
| GL_QCOM_extended_get2 = 85, |
| GL_QCOM_tiled_rendering = 86, |
| GL_AMD_compressed_ATC_texture = 87, |
| GL_OES_texture_half_float = 88, |
| GL_OES_vertex_half_float = 89, |
| } |
| |
| enum TextureKind { |
| UNDEFINED = 0, |
| TEXTURE2D = 1, |
| CUBEMAP = 2, |
| } |
| |
| ///////////////////////////////////////////////////////////////// |
| // Macros |
| ///////////////////////////////////////////////////////////////// |
| |
| macro u32 vertexAttribTypeSize(GLenum t) { |
| return switch (t) { |
| case GL_BYTE: 1 |
| case GL_UNSIGNED_BYTE: 1 |
| case GL_SHORT: 2 |
| case GL_UNSIGNED_SHORT: 2 |
| case GL_FIXED: 4 |
| case GL_FLOAT: 4 |
| case GL_HALF_FLOAT_ARB: 2 |
| case GL_HALF_FLOAT_OES: 2 |
| } |
| } |
| |
| macro s32 min(s32 a, s32 b) { |
| return switch (a < b) { |
| case true: a |
| case false: b |
| } |
| } |
| |
| /* Not ready for primetime yet... |
| macro u32 imageSize(u32 width, u32 height, GLenum format, GLenum type) { |
| return switch (format) { // TODO: Consider ty |
| case GL_ALPHA: width * height |
| case GL_LUMINANCE: width * height |
| case GL_LUMINANCE_ALPHA: width * height * 2 |
| case GL_RGB: width * height * 3 |
| case GL_RGBA: width * height * 4 |
| case GL_RED: width * height |
| case GL_RED_INTEGER: width * height |
| case GL_RG: width * height * 2 |
| case GL_RG_INTEGER: width * height * 2 |
| case GL_RGB_INTEGER: width * height * 3 |
| case GL_RGBA_INTEGER: width * height * 3 |
| case GL_DEPTH_COMPONENT: width * height |
| case GL_DEPTH_STENCIL: width * height |
| } |
| } |
| |
| macro s32 stateVariableSize(GLenum v) { |
| return switch (v) { |
| case GL_ACTIVE_TEXTURE: 1 |
| case GL_ALIASED_LINE_WIDTH_RANGE: 2 |
| case GL_ALIASED_POINT_SIZE_RANGE: 2 |
| case GL_ALPHA_BITS: 1 |
| case GL_ARRAY_BUFFER_BINDING: 1 |
| case GL_BLEND: 1 |
| case GL_BLEND_COLOR: 4 |
| case GL_BLEND_DST_ALPHA: 1 |
| case GL_BLEND_DST_RGB: 1 |
| case GL_BLEND_EQUATION_ALPHA: 1 |
| case GL_BLEND_EQUATION_RGB: 1 |
| case GL_BLEND_SRC_ALPHA: 1 |
| case GL_BLEND_SRC_RGB: 1 |
| case GL_BLUE_BITS: 1 |
| case GL_COLOR_CLEAR_VALUE: 4 |
| case GL_COLOR_WRITEMASK: 4 |
| case GL_CULL_FACE: 1 |
| case GL_CULL_FACE_MODE: 1 |
| case GL_CURRENT_PROGRAM: 1 |
| case GL_DEPTH_BITS: 1 |
| case GL_DEPTH_CLEAR_VALUE: 1 |
| case GL_DEPTH_FUNC: 1 |
| case GL_DEPTH_RANGE: 2 |
| case GL_DEPTH_TEST: 1 |
| case GL_DEPTH_WRITEMASK: 1 |
| case GL_DITHER: 1 |
| case GL_ELEMENT_ARRAY_BUFFER_BINDING: 1 |
| case GL_FRAMEBUFFER_BINDING: 1 |
| case GL_FRONT_FACE: 1 |
| case GL_GENERATE_MIPMAP_HINT: 1 |
| case GL_GREEN_BITS: 1 |
| case GL_IMPLEMENTATION_COLOR_READ_FORMAT: 1 |
| case GL_IMPLEMENTATION_COLOR_READ_TYPE: 1 |
| case GL_LINE_WIDTH: 1 |
| case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: 1 |
| case GL_MAX_CUBE_MAP_TEXTURE_SIZE: 1 |
| case GL_MAX_FRAGMENT_UNIFORM_VECTORS: 1 |
| case GL_MAX_RENDERBUFFER_SIZE: 1 |
| case GL_MAX_TEXTURE_IMAGE_UNITS: 1 |
| case GL_MAX_TEXTURE_SIZE: 1 |
| case GL_MAX_VARYING_VECTORS: 1 |
| case GL_MAX_VERTEX_ATTRIBS: 1 |
| case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: 1 |
| case GL_MAX_VERTEX_UNIFORM_VECTORS: 1 |
| case GL_MAX_VIEWPORT_DIMS: 2 |
| case GL_NUM_COMPRESSED_TEXTURE_FORMATS: 1 |
| case GL_NUM_SHADER_BINARY_FORMATS: 1 |
| case GL_PACK_ALIGNMENT: 1 |
| case GL_POLYGON_OFFSET_FACTOR: 1 |
| case GL_POLYGON_OFFSET_FILL: 1 |
| case GL_POLYGON_OFFSET_UNITS: 1 |
| case GL_RED_BITS: 1 |
| case GL_RENDERBUFFER_BINDING: 1 |
| case GL_SAMPLE_ALPHA_TO_COVERAGE: 1 |
| case GL_SAMPLE_BUFFERS: 1 |
| case GL_SAMPLE_COVERAGE: 1 |
| case GL_SAMPLE_COVERAGE_INVERT: 1 |
| case GL_SAMPLE_COVERAGE_VALUE: 1 |
| case GL_SAMPLES: 1 |
| case GL_SCISSOR_BOX: 4 |
| case GL_SCISSOR_TEST: 1 |
| case GL_SHADER_COMPILER: 1 |
| case GL_STENCIL_BACK_FAIL: 1 |
| case GL_STENCIL_BACK_FUNC: 1 |
| case GL_STENCIL_BACK_PASS_DEPTH_FAIL: 1 |
| case GL_STENCIL_BACK_PASS_DEPTH_PASS: 1 |
| case GL_STENCIL_BACK_REF: 1 |
| case GL_STENCIL_BACK_VALUE_MASK: 1 |
| case GL_STENCIL_BACK_WRITEMASK: 1 |
| case GL_STENCIL_BITS: 1 |
| case GL_STENCIL_CLEAR_VALUE: 1 |
| case GL_STENCIL_FAIL: 1 |
| case GL_STENCIL_FUNC: 1 |
| case GL_STENCIL_PASS_DEPTH_FAIL: 1 |
| case GL_STENCIL_PASS_DEPTH_PASS: 1 |
| case GL_STENCIL_REF: 1 |
| case GL_STENCIL_TEST: 1 |
| case GL_STENCIL_VALUE_MASK: 1 |
| case GL_STENCIL_WRITEMASK: 1 |
| case GL_SUBPIXEL_BITS: 1 |
| case GL_TEXTURE_BINDING_2D: 1 |
| case GL_TEXTURE_BINDING_CUBE_MAP: 1 |
| case GL_UNPACK_ALIGNMENT: 1 |
| case GL_VIEWPORT: 4 |
| case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: 1 |
| case GL_GPU_DISJOINT_EXT: 1 |
| } |
| } |
| */ |
| |
| @internal |
| class Color { |
| GLfloat Red |
| GLfloat Green |
| GLfloat Blue |
| GLfloat Alpha |
| } |
| |
| @internal |
| class Rect { |
| GLint X |
| GLint Y |
| GLsizei Width |
| GLsizei Height |
| } |
| |
| @internal |
| class Image { |
| GLsizei Width |
| GLsizei Height |
| u8[] Data |
| u32 Size |
| GLenum Format |
| } |
| |
| @internal |
| class Renderbuffer { |
| GLsizei Width |
| GLsizei Height |
| u8[] Data |
| GLenum Format |
| } |
| |
| @internal |
| class Texture { |
| TextureKind Kind |
| GLenum Format |
| map!(GLint, Image) Texture2D |
| map!(GLint, CubemapLevel) Cubemap |
| GLenum MagFilter = GL_LINEAR |
| GLenum MinFilter = GL_NEAREST_MIPMAP_LINEAR |
| GLenum WrapS = GL_REPEAT |
| GLenum WrapT = GL_REPEAT |
| GLenum SwizzleR = GL_RED |
| GLenum SwizzleG = GL_GREEN |
| GLenum SwizzleB = GL_BLUE |
| GLenum SwizzleA = GL_ALPHA |
| f32 MaxAnisotropy = 1.0 // EXT/texture_filter_anisotropic |
| } |
| |
| @internal |
| class CubemapLevel { |
| map!(GLenum, Image) Faces |
| } |
| |
| @internal |
| class FramebufferAttachmentInfo { |
| u32 Object |
| GLenum Type |
| GLint TextureLevel |
| GLenum CubeMapFace |
| } |
| |
| @internal |
| class Framebuffer { |
| map!(GLenum, FramebufferAttachmentInfo) Attachments |
| } |
| |
| @internal |
| class Buffer { |
| u8[] Data |
| GLsizeiptr Size = as!GLsizeiptr(0) |
| GLenum Usage = GL_STATIC_DRAW |
| |
| GLbitfield MappingAccess // The mapping access passed to glMapBufferRange. |
| s32 MappingOffset // The mapping offset passed to glMapBufferRange. |
| u8[] MappingData // The mapping data returned from glMapBufferRange. |
| } |
| |
| @internal |
| class Shader { |
| u8[] Binary |
| bool Compiled = false |
| bool Deletable = false |
| GLchar[] InfoLog |
| string Source |
| GLenum Type |
| } |
| |
| @internal |
| class VertexAttribute { |
| char[] Name |
| s32 VectorCount |
| GLenum Type |
| } |
| |
| @internal type GLint[2] Vec2i |
| @internal type GLint[3] Vec3i |
| @internal type GLint[4] Vec4i |
| @internal type GLfloat[2] Vec2f |
| @internal type GLfloat[3] Vec3f |
| @internal type GLfloat[4] Vec4f |
| @internal type Vec2f[2] Mat2f |
| @internal type Vec3f[3] Mat3f |
| @internal type Vec4f[4] Mat4f |
| |
| @internal |
| class Uniform { |
| string Name |
| GLenum Type |
| u8[] Value |
| } |
| |
| @internal |
| class Program { |
| map!(GLenum, ShaderId) Shaders |
| bool Linked |
| u8[] Binary |
| map!(string, AttributeLocation) AttributeBindings |
| map!(s32, VertexAttribute) Attributes |
| map!(UniformLocation, Uniform) Uniforms |
| GLchar[] InfoLog |
| } |
| |
| @internal |
| class VertexArray {} |
| |
| @internal |
| class VertexAttributeArray { |
| bool Enabled = false |
| u32 Size = 4 // Number of components. 1, 2, 3 or 4. |
| GLenum Type = GL_FLOAT // Type of each component. |
| bool Normalized = false |
| GLsizei Stride = 0 // Byte offset between each consecutive attribute, or 0 for tight. |
| BufferId Buffer = 0 |
| VertexPointer Pointer // Used if Buffer == 0 |
| } |
| |
| @internal |
| class Query {} |
| |
| ///////////////////////////////////////////////////////////////// |
| // State |
| ///////////////////////////////////////////////////////////////// |
| |
| @internal |
| class BlendState { |
| GLenum SrcRgbBlendFactor = GL_ONE |
| GLenum SrcAlphaBlendFactor = GL_ZERO |
| GLenum DstRgbBlendFactor = GL_ONE |
| GLenum DstAlphaBlendFactor = GL_ZERO |
| GLenum BlendEquationRgb = GL_FUNC_ADD |
| GLenum BlendEquationAlpha = GL_FUNC_ADD |
| Color BlendColor |
| } |
| |
| @internal |
| class RasterizerState { |
| bool DepthMask = true |
| GLenum DepthTestFunction = GL_LESS |
| GLfloat DepthNear = 0.0 |
| GLfloat DepthFar = 1.0 |
| bool ColorMaskRed = true |
| bool ColorMaskGreen = true |
| bool ColorMaskBlue = true |
| bool ColorMaskAlpha = true |
| map!(GLenum, GLuint) StencilMask |
| Rect Viewport |
| Rect Scissor |
| GLenum FrontFace = GL_CCW |
| GLenum CullFace = GL_BACK |
| GLfloat LineWidth = 1.0 |
| GLfloat PolygonOffsetFactor |
| GLfloat PolygonOffsetUnits |
| GLfloat SampleCoverageValue = 1.0 |
| bool SampleCoverageInvert |
| } |
| |
| @internal |
| class ClearState { |
| Color ClearColor |
| GLfloat ClearDepth = 1.0 |
| GLint ClearStencil |
| } |
| |
| @replay_remap type u32 RenderbufferId |
| @replay_remap type u32 TextureId |
| @replay_remap type u32 FramebufferId |
| @replay_remap type u32 BufferId |
| @replay_remap type u32 ShaderId |
| @replay_remap type u32 ProgramId |
| @replay_remap type u32 VertexArrayId |
| @replay_remap type u32 QueryId |
| @replay_remap type s32 UniformLocation |
| type u32 SamplerId |
| type u32 PipelineId |
| type u32 UniformBlockId |
| type u32 TransformFeedbackId |
| |
| type u32 AttributeLocation |
| |
| @replay_custom_value type const void* IndicesPointer |
| @replay_custom_value type const void* VertexPointer |
| @replay_custom_value type const void* TexturePointer |
| @replay_custom_value type const void* BufferDataPointer |
| |
| @internal |
| class Objects { |
| map!(RenderbufferId, ref!Renderbuffer) Renderbuffers |
| map!(TextureId, ref!Texture) Textures |
| map!(FramebufferId, ref!Framebuffer) Framebuffers |
| map!(BufferId, ref!Buffer) Buffers |
| map!(ShaderId, ref!Shader) Shaders |
| map!(ProgramId, ref!Program) Programs |
| map!(VertexArrayId, ref!VertexArray) VertexArrays |
| map!(QueryId, ref!Query) Queries |
| } |
| |
| @internal type u32 ContextID |
| |
| @internal |
| class Context { |
| ContextID Identifier |
| BlendState Blending |
| RasterizerState Rasterizing |
| ClearState Clearing |
| map!(GLenum, FramebufferId) BoundFramebuffers |
| map!(GLenum, RenderbufferId) BoundRenderbuffers |
| map!(GLenum, BufferId) BoundBuffers |
| ProgramId BoundProgram |
| VertexArrayId BoundVertexArray |
| map!(AttributeLocation, ref!VertexAttributeArray) VertexAttributeArrays |
| TextureUnitMap TextureUnits |
| GLenum ActiveTextureUnit = GL_TEXTURE0 |
| map!(GLenum, bool) Capabilities |
| GLenum GenerateMipmapHint = GL_DONT_CARE |
| map!(GLenum, GLint) PixelStorage |
| Objects Instances |
| bool PreserveBuffersOnSwap |
| } |
| |
| type u64 ThreadID |
| |
| // Globals |
| ContextID NextContextID |
| ThreadID CurrentThread |
| map!(ThreadID, ref!Context) Contexts |
| |
| macro ref!Context GetContext() { |
| context := Contexts[CurrentThread] |
| assert(context != null) |
| return context |
| } |
| |
| macro void SetContext(ref!Context context) { |
| Contexts[CurrentThread] = context |
| } |
| |
| macro ref!Context CreateContext() { |
| identifier := NextContextID |
| NextContextID = NextContextID + 1 |
| |
| ctx := new!Context() |
| ctx.Identifier = identifier |
| ctx.Instances.Buffers[0] = new!Buffer() |
| ctx.Instances.Textures[0] = new!Texture() |
| ctx.Instances.Renderbuffers[0] = new!Renderbuffer() |
| |
| color_id := as!RenderbufferId(0xffffffff) |
| depth_id := as!RenderbufferId(0xfffffffe) |
| stencil_id := as!RenderbufferId(0xfffffffd) |
| |
| ctx.Instances.Renderbuffers[color_id] = new!Renderbuffer() |
| ctx.Instances.Renderbuffers[depth_id] = new!Renderbuffer() |
| ctx.Instances.Renderbuffers[stencil_id] = new!Renderbuffer() |
| |
| backbuffer := new!Framebuffer() |
| backbuffer.Attachments[GL_COLOR_ATTACHMENT0] = FramebufferAttachmentInfo( |
| Object: as!u32(color_id), |
| Type: GL_RENDERBUFFER, |
| CubeMapFace: GL_TEXTURE_CUBE_MAP_POSITIVE_X, |
| ) |
| |
| backbuffer.Attachments[GL_DEPTH_ATTACHMENT] = FramebufferAttachmentInfo( |
| Object: as!u32(depth_id), |
| Type: GL_RENDERBUFFER, |
| CubeMapFace: GL_TEXTURE_CUBE_MAP_POSITIVE_X, |
| ) |
| |
| backbuffer.Attachments[GL_STENCIL_ATTACHMENT] = FramebufferAttachmentInfo( |
| Object: as!u32(stencil_id), |
| Type: GL_RENDERBUFFER, |
| CubeMapFace: GL_TEXTURE_CUBE_MAP_POSITIVE_X, |
| ) |
| |
| ctx.Instances.Framebuffers[0] = backbuffer |
| |
| ctx.BoundFramebuffers[GL_DRAW_FRAMEBUFFER] = 0 |
| ctx.BoundFramebuffers[GL_READ_FRAMEBUFFER] = 0 |
| |
| // TODO: Stencil function |
| ctx.Rasterizing.StencilMask[GL_FRONT] = 0xFFFFFFFF |
| ctx.Rasterizing.StencilMask[GL_BACK] = 0xFFFFFFFF |
| |
| ctx.PixelStorage[GL_PACK_ALIGNMENT] = 4 |
| ctx.PixelStorage[GL_UNPACK_ALIGNMENT] = 4 |
| |
| for i in (0 .. 64) { // TODO: Count |
| ctx.VertexAttributeArrays[as!AttributeLocation(i)] = new!VertexAttributeArray() |
| } |
| |
| return ctx |
| } |
| |
| ///////////////////////////////////////////////////////////////// |
| // EGL APIs |
| ///////////////////////////////////////////////////////////////// |
| type int EGLBoolean |
| type int EGLint |
| type void* EGLConfig |
| type void* EGLContext |
| type void* EGLDisplay |
| type void* EGLSurface |
| |
| map!(EGLContext, ref!Context) EGLContexts |
| |
| @no_replay |
| ///http://www.khronos.org/registry/egl/sdk/docs/man/html/eglInitialize.xhtml |
| cmd EGLBoolean eglInitialize(EGLDisplay dpy, EGLint* major, EGLint* minor) { |
| if major != null { |
| major[0] = ? |
| } |
| if major != null { |
| minor[0] = ? |
| } |
| return ? |
| } |
| |
| @no_replay |
| ///http://www.khronos.org/registry/egl/sdk/docs/man/html/eglCreateContext.xhtml |
| cmd EGLContext eglCreateContext(EGLDisplay display, |
| EGLConfig config, |
| EGLContext share_context, |
| EGLint* attrib_list) { |
| context := as!EGLContext(?) |
| EGLContexts[context] = CreateContext() |
| return context |
| } |
| |
| @no_replay |
| ///http://www.khronos.org/registry/egl/sdk/docs/man/html/eglMakeCurrent.xhtml |
| cmd EGLBoolean eglMakeCurrent(EGLDisplay display, |
| EGLSurface draw, |
| EGLSurface read, |
| EGLContext context) { |
| SetContext(EGLContexts[context]) |
| return ? |
| } |
| |
| @no_replay |
| @EndOfFrame |
| ///http://www.khronos.org/registry/egl/sdk/docs/man/html/eglSwapBuffers.xhtml |
| cmd EGLBoolean eglSwapBuffers(EGLDisplay display, void* surface) { |
| return ? |
| } |
| |
| @no_replay |
| cmd EGLBoolean eglQuerySurface(EGLDisplay display, EGLSurface surface, EGLint attribute, EGLint* value) { |
| value[0] = ? |
| return ? |
| } |
| |
| ///////////////////////////////////////////////////////////////// |
| // GLX APIs |
| ///////////////////////////////////////////////////////////////// |
| type void* GLXContext |
| type void* GLXDrawable |
| type int Bool |
| |
| map!(GLXContext, ref!Context) GLXContexts |
| |
| @no_replay |
| cmd GLXContext glXCreateContext(void* dpy, void* vis, GLXContext shareList, bool direct) { |
| context := as!GLXContext(?) |
| GLXContexts[context] = CreateContext() |
| return context |
| } |
| |
| @no_replay |
| cmd GLXContext glXCreateNewContext(void* display, void* fbconfig, u32 type, GLXContext shared, bool direct) { |
| context := as!GLXContext(?) |
| GLXContexts[context] = CreateContext() |
| return context |
| } |
| |
| @no_replay |
| cmd Bool glXMakeContextCurrent(void* display, GLXDrawable draw, GLXDrawable read, GLXContext ctx) { |
| SetContext(GLXContexts[ctx]) |
| return ? |
| } |
| |
| @no_replay |
| cmd Bool glXMakeCurrent(void* display, GLXDrawable drawable, GLXContext ctx) { |
| SetContext(GLXContexts[ctx]) |
| return ? |
| } |
| |
| @no_replay |
| @EndOfFrame |
| cmd void glXSwapBuffers(void* display, GLXDrawable drawable) { |
| } |
| |
| @no_replay |
| cmd int glXQueryDrawable(void* display, GLXDrawable draw, int attribute, int* value) { |
| value[0] = ? |
| return ? |
| } |
| |
| ///////////////////////////////////////////////////////////////// |
| // WGL APIs |
| ///////////////////////////////////////////////////////////////// |
| type void* HGLRC |
| type void* HDC |
| type int BOOL |
| |
| map!(HGLRC, ref!Context) WGLContexts |
| |
| @no_replay |
| ///http://msdn.microsoft.com/en-us/library/windows/desktop/dd374379(v=vs.85).aspx |
| cmd HGLRC wglCreateContext(HDC hdc) { |
| context := as!HGLRC(?) |
| WGLContexts[context] = CreateContext() |
| return context |
| } |
| |
| @no_replay |
| ///http://www.opengl.org/registry/specs/ARB/wgl_create_context.txt |
| cmd HGLRC wglCreateContextAttribsARB(HDC hdc, HGLRC hShareContext, int* attribList) { |
| context := as!HGLRC(?) |
| WGLContexts[context] = CreateContext() |
| return context |
| } |
| |
| @no_replay |
| ///http://msdn.microsoft.com/en-us/library/windows/desktop/dd374387(v=vs.85).aspx |
| cmd BOOL wglMakeCurrent(HDC hdc, HGLRC hglrc) { |
| SetContext(WGLContexts[hglrc]) |
| return ? |
| } |
| |
| @no_replay |
| @EndOfFrame |
| ///http://msdn.microsoft.com/en-us/library/dd369060(v=vs.85) |
| cmd void wglSwapBuffers(HDC hdc) { } |
| |
| ///////////////////////////////////////////////////////////////// |
| // CGL APIs |
| ///////////////////////////////////////////////////////////////// |
| type int CGLError |
| type void* CGLPixelFormatObj |
| type void* CGLContextObj |
| type void* CGSConnectionID |
| type s32 CGSWindowID |
| type s32 CGSSurfaceID |
| |
| map!(CGLContextObj, ref!Context) CGLContexts |
| |
| @no_replay |
| ///http://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CGL_OpenGL/index.html#//apple_ref/c/func/CGLCreateContext |
| cmd CGLError CGLCreateContext(CGLPixelFormatObj pix, CGLContextObj share, CGLContextObj* ctx) { |
| context := as!CGLContextObj(?) |
| CGLContexts[context] = CreateContext() |
| ctx[0] = context |
| return ? |
| } |
| |
| @no_replay |
| cmd CGLError CGLSetCurrentContext(CGLContextObj ctx) { |
| SetContext(CGLContexts[ctx]) |
| return ? |
| } |
| |
| @no_replay |
| cmd int CGLGetSurface(CGLContextObj ctx, CGSConnectionID* cid, CGSWindowID* wid, CGSSurfaceID* sid) { |
| cid[0] = ? |
| wid[0] = ? |
| sid[0] = ? |
| return ? |
| } |
| |
| @no_replay |
| cmd int CGSGetSurfaceBounds(CGSConnectionID cid, CGSWindowID wid, CGSSurfaceID sid, f64* bounds) { |
| write(bounds[0:4]) |
| return ? |
| } |
| |
| @no_replay |
| @EndOfFrame |
| cmd CGLError CGLFlushDrawable(CGLContextObj ctx) { |
| return ? |
| } |
| |
| |
| ///////////////////////////////////////////////////////////////// |
| // GLES 2 APIs |
| ///////////////////////////////////////////////////////////////// |
| |
| macro void ReadVertexArrays(ref!Context ctx, u32 first_index, u32 last_index) { |
| for i in (0 .. len(ctx.VertexAttributeArrays)) { // TODO: HACK: We need to iterate a map. |
| arr := ctx.VertexAttributeArrays[as!AttributeLocation(i)] |
| if arr.Enabled && arr.Buffer == 0 { |
| elsize := vertexAttribTypeSize(arr.Type) * arr.Size |
| elstride := switch (arr.Stride == 0) { |
| case true: elsize |
| case false: as!u32(arr.Stride) |
| } |
| for v in (first_index .. (last_index + 1)) { |
| offset := elstride * v |
| read(arr.Pointer[offset:offset + elsize]) |
| } |
| } |
| } |
| } |
| |
| macro u32 IndexSize(GLenum indices_type) { |
| return switch (indices_type) { |
| case GL_UNSIGNED_BYTE: 1 |
| case GL_UNSIGNED_SHORT: 2 |
| case GL_UNSIGNED_INT: 4 |
| } |
| } |
| |
| extern u32 minIndex(u8* indices, GLenum indices_type, u32 offset, u32 count) |
| extern u32 maxIndex(u8* indices, GLenum indices_type, u32 offset, u32 count) |
| |
| ///////////////////////////////////////////////////////////////// |
| // Desktop GL |
| ///////////////////////////////////////////////////////////////// |
| |
| // EXT_disjoint_timer_query |
| // TODO: Always use glGetQueryObjectui64vEXT? |
| |
| cmd void glGetQueryObjecti64v(QueryId query, GLenum parameter, s64* value) { |
| value[0] = ? |
| } |
| |
| cmd void glGetQueryObjectui64v(QueryId query, GLenum parameter, u64* value) { |
| value[0] = ? |
| } |
| |