1'''OpenGL extension ARB.separate_shader_objects 2 3This module customises the behaviour of the 4OpenGL.raw.GL.ARB.separate_shader_objects to provide a more 5Python-friendly API 6 7Overview (from the spec) 8 9 Conventional GLSL requires multiple shader stages (vertex, 10 fragment, geometry, tessellation control, and tessellation 11 evaluation) to be linked into a single monolithic program object to 12 specify a GLSL shader for each stage. 13 14 While GLSL's monolithic approach has some advantages for 15 optimizing shaders as a unit that span multiple stages, all 16 existing GPU hardware supports the more flexible mix-and-match 17 approach. 18 19 Shaders written for HLSL9, Cg, the prior OpenGL assembly program 20 extensions, and game console favor a more flexible "mix-and-match" 21 approach to specifying shaders independently for these different 22 shader stages. Many developers build their shader content around 23 the mix-and-match approach where they can use a single vertex shader 24 with multiple fragment shaders (or vice versa). 25 26 This extension adopts a "mix-and-match" shader stage model for GLSL 27 allowing multiple different GLSL program objects to be bound at once 28 each to an individual rendering pipeline stage independently of 29 other stage bindings. This allows program objects to contain only 30 the shader stages that best suit the applications needs. 31 32 This extension introduces the program pipeline object that serves as 33 a container for the program bound to any particular rendering stage. 34 It can be bound, unbound, and rebound to simply save and restore the 35 complete shader stage to program object bindings. Like framebuffer 36 and vertex array objects, program pipeline objects are "container" 37 objects that are not shared between contexts. 38 39 To bind a program object to a specific shader stage or set of 40 stages, UseProgramStages is used. The VERTEX_SHADER_BIT, 41 GEOMETRY_SHADER_BIT, FRAGMENT_SHADER_BIT, TESS_CONTROL_SHADER_BIT, 42 and TESS_EVALUATION_SHADER_BIT tokens refer to the conventional 43 vertex, geometry, fragment, tessellation control and tessellation 44 evaluation stages respectively. ActiveShaderProgram specifies the 45 program that Uniform* commands will update. 46 47 While ActiveShaderProgram allows the use of conventional Uniform* 48 commands to update uniform variable values for separable program 49 objects, this extension provides a preferrable interface in a set 50 of ProgramUniform* commands that update the same uniform variables 51 but take a parameter indicating the program object to be updated, 52 rather than updating the currently active program object. These 53 commands mirror those introduced in EXT_direct_state_access. 54 55 While glActiveShaderProgram provides a selector for setting and 56 querying uniform values of a program object, the glProgramUniform* 57 commands provide a selector-free way to modify uniforms of a GLSL 58 program object without an explicit bind. This selector-free model 59 reduces API overhead and provides a cleaner interface for 60 applications. 61 62 Separate linking creates the possibility that certain output varyings 63 of a shader may go unread by the subsequent shader inputting varyings. 64 In this case, the output varyings are simply ignored. It is also 65 possible input varyings from a shader may not be written as output 66 varyings of a preceding shader. In this case, the unwritten input 67 varying values are undefined. 68 69 This extension builds on the proof-of-concept provided by 70 EXT_separate_shader_objects which demonstrated that separate 71 shader objects can work for GLSL. EXT_separate_shader_objects 72 was a response to repeated requests for this functionality from 73 3D developers. 74 75 This ARB version addresses several "loose ends" in the prior 76 EXT extension. In particular, it allows user-defined varyings 77 with explicitly defined locations or implicitly assigned locations. 78 79 This ARB extension extends the GLSL language's use of layout 80 qualifiers to provide cross-stage interfacing. 81 82The official definition of this extension is available here: 83http://www.opengl.org/registry/specs/ARB/separate_shader_objects.txt 84''' 85from OpenGL import platform, constant, arrays 86from OpenGL import extensions, wrapper 87import ctypes 88from OpenGL.raw.GL import _types, _glgets 89from OpenGL.raw.GL.ARB.separate_shader_objects import * 90from OpenGL.raw.GL.ARB.separate_shader_objects import _EXTENSION_NAME 91 92def glInitSeparateShaderObjectsARB(): 93 '''Return boolean indicating whether this extension is available''' 94 from OpenGL import extensions 95 return extensions.hasGLExtension( _EXTENSION_NAME ) 96 97# INPUT glCreateShaderProgramv.strings size not checked against count 98glCreateShaderProgramv=wrapper.wrapper(glCreateShaderProgramv).setInputArraySize( 99 'strings', None 100) 101# INPUT glDeleteProgramPipelines.pipelines size not checked against n 102glDeleteProgramPipelines=wrapper.wrapper(glDeleteProgramPipelines).setInputArraySize( 103 'pipelines', None 104) 105glGenProgramPipelines=wrapper.wrapper(glGenProgramPipelines).setOutput( 106 'pipelines',size=lambda x:(x,),pnameArg='n',orPassIn=True 107) 108glGetProgramPipelineiv=wrapper.wrapper(glGetProgramPipelineiv).setOutput( 109 'params',size=_glgets._glget_size_mapping,pnameArg='pname',orPassIn=True 110) 111glProgramUniform1iv=wrapper.wrapper(glProgramUniform1iv).setInputArraySize( 112 'value', 1 113) 114glProgramUniform1fv=wrapper.wrapper(glProgramUniform1fv).setInputArraySize( 115 'value', 1 116) 117glProgramUniform1dv=wrapper.wrapper(glProgramUniform1dv).setInputArraySize( 118 'value', 1 119) 120glProgramUniform1uiv=wrapper.wrapper(glProgramUniform1uiv).setInputArraySize( 121 'value', 1 122) 123glProgramUniform2iv=wrapper.wrapper(glProgramUniform2iv).setInputArraySize( 124 'value', 2 125) 126glProgramUniform2fv=wrapper.wrapper(glProgramUniform2fv).setInputArraySize( 127 'value', 2 128) 129glProgramUniform2dv=wrapper.wrapper(glProgramUniform2dv).setInputArraySize( 130 'value', 2 131) 132glProgramUniform2uiv=wrapper.wrapper(glProgramUniform2uiv).setInputArraySize( 133 'value', 2 134) 135glProgramUniform3iv=wrapper.wrapper(glProgramUniform3iv).setInputArraySize( 136 'value', 3 137) 138glProgramUniform3fv=wrapper.wrapper(glProgramUniform3fv).setInputArraySize( 139 'value', 3 140) 141glProgramUniform3dv=wrapper.wrapper(glProgramUniform3dv).setInputArraySize( 142 'value', 3 143) 144glProgramUniform3uiv=wrapper.wrapper(glProgramUniform3uiv).setInputArraySize( 145 'value', 3 146) 147glProgramUniform4iv=wrapper.wrapper(glProgramUniform4iv).setInputArraySize( 148 'value', 4 149) 150glProgramUniform4fv=wrapper.wrapper(glProgramUniform4fv).setInputArraySize( 151 'value', 4 152) 153glProgramUniform4dv=wrapper.wrapper(glProgramUniform4dv).setInputArraySize( 154 'value', 4 155) 156glProgramUniform4uiv=wrapper.wrapper(glProgramUniform4uiv).setInputArraySize( 157 'value', 4 158) 159glProgramUniformMatrix2fv=wrapper.wrapper(glProgramUniformMatrix2fv).setInputArraySize( 160 'value', 2 161) 162glProgramUniformMatrix3fv=wrapper.wrapper(glProgramUniformMatrix3fv).setInputArraySize( 163 'value', 3 164) 165glProgramUniformMatrix4fv=wrapper.wrapper(glProgramUniformMatrix4fv).setInputArraySize( 166 'value', 4 167) 168glProgramUniformMatrix2dv=wrapper.wrapper(glProgramUniformMatrix2dv).setInputArraySize( 169 'value', 2 170) 171glProgramUniformMatrix3dv=wrapper.wrapper(glProgramUniformMatrix3dv).setInputArraySize( 172 'value', 3 173) 174glProgramUniformMatrix4dv=wrapper.wrapper(glProgramUniformMatrix4dv).setInputArraySize( 175 'value', 4 176) 177# INPUT glProgramUniformMatrix2x3fv.value size not checked against count 178glProgramUniformMatrix2x3fv=wrapper.wrapper(glProgramUniformMatrix2x3fv).setInputArraySize( 179 'value', None 180) 181# INPUT glProgramUniformMatrix3x2fv.value size not checked against count 182glProgramUniformMatrix3x2fv=wrapper.wrapper(glProgramUniformMatrix3x2fv).setInputArraySize( 183 'value', None 184) 185# INPUT glProgramUniformMatrix2x4fv.value size not checked against count 186glProgramUniformMatrix2x4fv=wrapper.wrapper(glProgramUniformMatrix2x4fv).setInputArraySize( 187 'value', None 188) 189# INPUT glProgramUniformMatrix4x2fv.value size not checked against count 190glProgramUniformMatrix4x2fv=wrapper.wrapper(glProgramUniformMatrix4x2fv).setInputArraySize( 191 'value', None 192) 193# INPUT glProgramUniformMatrix3x4fv.value size not checked against count 194glProgramUniformMatrix3x4fv=wrapper.wrapper(glProgramUniformMatrix3x4fv).setInputArraySize( 195 'value', None 196) 197# INPUT glProgramUniformMatrix4x3fv.value size not checked against count 198glProgramUniformMatrix4x3fv=wrapper.wrapper(glProgramUniformMatrix4x3fv).setInputArraySize( 199 'value', None 200) 201# INPUT glProgramUniformMatrix2x3dv.value size not checked against count 202glProgramUniformMatrix2x3dv=wrapper.wrapper(glProgramUniformMatrix2x3dv).setInputArraySize( 203 'value', None 204) 205# INPUT glProgramUniformMatrix3x2dv.value size not checked against count 206glProgramUniformMatrix3x2dv=wrapper.wrapper(glProgramUniformMatrix3x2dv).setInputArraySize( 207 'value', None 208) 209# INPUT glProgramUniformMatrix2x4dv.value size not checked against count 210glProgramUniformMatrix2x4dv=wrapper.wrapper(glProgramUniformMatrix2x4dv).setInputArraySize( 211 'value', None 212) 213# INPUT glProgramUniformMatrix4x2dv.value size not checked against count 214glProgramUniformMatrix4x2dv=wrapper.wrapper(glProgramUniformMatrix4x2dv).setInputArraySize( 215 'value', None 216) 217# INPUT glProgramUniformMatrix3x4dv.value size not checked against count 218glProgramUniformMatrix3x4dv=wrapper.wrapper(glProgramUniformMatrix3x4dv).setInputArraySize( 219 'value', None 220) 221# INPUT glProgramUniformMatrix4x3dv.value size not checked against count 222glProgramUniformMatrix4x3dv=wrapper.wrapper(glProgramUniformMatrix4x3dv).setInputArraySize( 223 'value', None 224) 225glGetProgramPipelineInfoLog=wrapper.wrapper(glGetProgramPipelineInfoLog).setOutput( 226 'length',size=(1,),orPassIn=True 227).setOutput( 228 'infoLog',size=lambda x:(x,),pnameArg='bufSize',orPassIn=True 229) 230### END AUTOGENERATED SECTION