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