Graphics.Rendering.OpenGL.GL.Shaders API needlessly "helpful"

Edward Kmett <[email protected]> Fri, 28 Oct 2011 17:14:22 -0400
Newsgroups gmane.comp.lang.haskell.hopengl
Message-ID <CAJumaK8JovMc6chDFCvqDxztiHxzCWYriQETanN0w-Lpog9AhA@mail.gmail.com>
--===============2964010718979018044==
Content-Type: multipart/alternative; boundary=f46d04451a457f4f3c04b0625fdc

--f46d04451a457f4f3c04b0625fdc
Content-Type: text/plain; charset=UTF-8

Is there any thought as to a better way to deal with

https://github.com/haskell-opengl/OpenGL/blob/master/Graphics/Rendering/OpenGL/GL/Shaders.hs?

If you have code that dynamically constructs and deletes single shaders
frequently, the API exposed there just introduces O(n) overhead for every
such construction.


*setAttachedShaders* :: Program -> ([VertexShader],[FragmentShader]) -> IO ()
setAttachedShaders p@(Program program) (vs, fs) = do
   currentIDs <- getAttachedShaderIDs p
   let newIDs = map shaderID vs ++ map shaderID fs
   mapM_ (glAttachShader program) (newIDs \\ currentIDs)
   mapM_ (glDetachShader program) (currentIDs \\ newIDs)

-Edward Kmett

--f46d04451a457f4f3c04b0625fdc
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div><span style=3D"background-color: transparent; ">Is there any thought a=
s to a better way to deal with</span></div><div><br></div><div><a href=3D"h=
ttps://github.com/haskell-opengl/OpenGL/blob/master/Graphics/Rendering/Open=
GL/GL/Shaders.hs">https://github.com/haskell-opengl/OpenGL/blob/master/Grap=
hics/Rendering/OpenGL/GL/Shaders.hs</a> ?</div>
<div><br></div><div>If you have code that dynamically constructs and delete=
s single shaders frequently, the API exposed there just introduces O(n) ove=
rhead for every such construction.</div><div><pre style=3D"margin-top: 0px;=
 margin-bottom: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: =
0px; padding-left: 0px; font: normal normal normal 12px/normal &#39;Bitstre=
am Vera Sans Mono&#39;, Courier, monospace; background-color: rgb(255, 255,=
 255); ">
<div class=3D"line" id=3D"LC245" style=3D"margin-top: 0px; margin-right: 0p=
x; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0=
px; padding-bottom: 0px; padding-left: 1em; "><span class=3D"nf" style=3D"m=
argin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; pa=
dding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;=
 "><font face=3D"arial" size=3D"2"><span style=3D"white-space: normal;"><br=
 class=3D"Apple-interchange-newline">
</span></font><font color=3D"#990000"><span style=3D"line-height: 1.4;"><b>=
setAttachedShaders</b></span></font></span><span style=3D"line-height: 1.4;=
"> </span><span class=3D"ow" style=3D"font-family: &#39;Bitstream Vera Sans=
 Mono&#39;, Courier, monospace; line-height: 1.4; font-size: 12px; margin-t=
op: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-t=
op: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-w=
eight: bold; ">::</span><span style=3D"line-height: 1.4;"> </span><span cla=
ss=3D"kt" style=3D"font-family: &#39;Bitstream Vera Sans Mono&#39;, Courier=
, monospace; line-height: 1.4; font-size: 12px; margin-top: 0px; margin-rig=
ht: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-ri=
ght: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(68, 85, 136); =
font-weight: bold; ">Program</span><span style=3D"line-height: 1.4;"> </spa=
n><span class=3D"ow" style=3D"font-family: &#39;Bitstream Vera Sans Mono&#3=
9;, Courier, monospace; line-height: 1.4; font-size: 12px; margin-top: 0px;=
 margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px;=
 padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-weight: b=
old; ">-&gt;</span><span style=3D"line-height: 1.4;"> </span><span class=3D=
"p" style=3D"font-family: &#39;Bitstream Vera Sans Mono&#39;, Courier, mono=
space; line-height: 1.4; font-size: 12px; margin-top: 0px; margin-right: 0p=
x; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0=
px; padding-bottom: 0px; padding-left: 0px; ">([</span><span class=3D"kt" s=
tyle=3D"font-family: &#39;Bitstream Vera Sans Mono&#39;, Courier, monospace=
; line-height: 1.4; font-size: 12px; margin-top: 0px; margin-right: 0px; ma=
rgin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; p=
adding-bottom: 0px; padding-left: 0px; color: rgb(68, 85, 136); font-weight=
: bold; ">VertexShader</span><span class=3D"p" style=3D"font-family: &#39;B=
itstream Vera Sans Mono&#39;, Courier, monospace; line-height: 1.4; font-si=
ze: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-le=
ft: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding=
-left: 0px; ">],[</span><span class=3D"kt" style=3D"font-family: &#39;Bitst=
ream Vera Sans Mono&#39;, Courier, monospace; line-height: 1.4; font-size: =
12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: =
0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-lef=
t: 0px; color: rgb(68, 85, 136); font-weight: bold; ">FragmentShader</span>=
<span class=3D"p" style=3D"font-family: &#39;Bitstream Vera Sans Mono&#39;,=
 Courier, monospace; line-height: 1.4; font-size: 12px; margin-top: 0px; ma=
rgin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; pa=
dding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">])</span><span =
style=3D"line-height: 1.4;"> </span><span class=3D"ow" style=3D"font-family=
: &#39;Bitstream Vera Sans Mono&#39;, Courier, monospace; line-height: 1.4;=
 font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; m=
argin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px;=
 padding-left: 0px; font-weight: bold; ">-&gt;</span><span style=3D"line-he=
ight: 1.4;"> </span><span class=3D"kt" style=3D"font-family: &#39;Bitstream=
 Vera Sans Mono&#39;, Courier, monospace; line-height: 1.4; font-size: 12px=
; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px;=
 padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0=
px; color: rgb(68, 85, 136); font-weight: bold; ">IO</span><span style=3D"l=
ine-height: 1.4;"> </span><span class=3D"nb" style=3D"font-family: &#39;Bit=
stream Vera Sans Mono&#39;, Courier, monospace; line-height: 1.4; font-size=
: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left=
: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-l=
eft: 0px; color: rgb(0, 134, 179); ">()</span></div>
<div class=3D"line" id=3D"LC246" style=3D"font-family: &#39;Bitstream Vera =
Sans Mono&#39;, Courier, monospace; line-height: 1.4; font-size: 12px; marg=
in-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; paddi=
ng-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; ">
<span class=3D"nf" style=3D"margin-top: 0px; margin-right: 0px; margin-bott=
om: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bo=
ttom: 0px; padding-left: 0px; color: rgb(153, 0, 0); font-weight: bold; ">s=
etAttachedShaders</span> <span class=3D"n" style=3D"margin-top: 0px; margin=
-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; paddin=
g-right: 0px; padding-bottom: 0px; padding-left: 0px; ">p</span><span class=
=3D"o" style=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; mar=
gin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; p=
adding-left: 0px; font-weight: bold; ">@</span><span class=3D"p" style=3D"m=
argin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; pa=
dding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;=
 ">(</span><span class=3D"kt" style=3D"margin-top: 0px; margin-right: 0px; =
margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px;=
 padding-bottom: 0px; padding-left: 0px; color: rgb(68, 85, 136); font-weig=
ht: bold; ">Program</span> <span class=3D"n" style=3D"margin-top: 0px; marg=
in-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padd=
ing-right: 0px; padding-bottom: 0px; padding-left: 0px; ">program</span><sp=
an class=3D"p" style=3D"margin-top: 0px; margin-right: 0px; margin-bottom: =
0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom=
: 0px; padding-left: 0px; ">)</span> <span class=3D"p" style=3D"margin-top:=
 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top:=
 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">(</span=
><span class=3D"n" style=3D"margin-top: 0px; margin-right: 0px; margin-bott=
om: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bo=
ttom: 0px; padding-left: 0px; ">vs</span><span class=3D"p" style=3D"margin-=
top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-=
top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">,</=
span> <span class=3D"n" style=3D"margin-top: 0px; margin-right: 0px; margin=
-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; paddi=
ng-bottom: 0px; padding-left: 0px; ">fs</span><span class=3D"p" style=3D"ma=
rgin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; pad=
ding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; =
">)</span> <span class=3D"ow" style=3D"margin-top: 0px; margin-right: 0px; =
margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px;=
 padding-bottom: 0px; padding-left: 0px; font-weight: bold; ">=3D</span> <s=
pan class=3D"kr" style=3D"margin-top: 0px; margin-right: 0px; margin-bottom=
: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bott=
om: 0px; padding-left: 0px; font-weight: bold; ">do</span></div>
<div class=3D"line" id=3D"LC247" style=3D"font-family: &#39;Bitstream Vera =
Sans Mono&#39;, Courier, monospace; line-height: 1.4; font-size: 12px; marg=
in-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; paddi=
ng-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; ">
=C2=A0=C2=A0=C2=A0<span class=3D"n" style=3D"margin-top: 0px; margin-right:=
 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right=
: 0px; padding-bottom: 0px; padding-left: 0px; ">currentIDs</span> <span cl=
ass=3D"ow" style=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px;=
 margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0p=
x; padding-left: 0px; font-weight: bold; ">&lt;-</span> <span class=3D"n" s=
tyle=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left=
: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-l=
eft: 0px; ">getAttachedShaderIDs</span> <span class=3D"n" style=3D"margin-t=
op: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-t=
op: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">p</s=
pan></div>
<div class=3D"line" id=3D"LC248" style=3D"font-family: &#39;Bitstream Vera =
Sans Mono&#39;, Courier, monospace; line-height: 1.4; font-size: 12px; marg=
in-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; paddi=
ng-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; ">
=C2=A0=C2=A0=C2=A0<span class=3D"kr" style=3D"margin-top: 0px; margin-right=
: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-righ=
t: 0px; padding-bottom: 0px; padding-left: 0px; font-weight: bold; ">let</s=
pan> <span class=3D"n" style=3D"margin-top: 0px; margin-right: 0px; margin-=
bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; paddin=
g-bottom: 0px; padding-left: 0px; ">newIDs</span> <span class=3D"ow" style=
=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0p=
x; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left:=
 0px; font-weight: bold; ">=3D</span> <span class=3D"n" style=3D"margin-top=
: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top=
: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">map</s=
pan> <span class=3D"n" style=3D"margin-top: 0px; margin-right: 0px; margin-=
bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; paddin=
g-bottom: 0px; padding-left: 0px; ">shaderID</span> <span class=3D"n" style=
=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0p=
x; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left:=
 0px; ">vs</span> <span class=3D"o" style=3D"margin-top: 0px; margin-right:=
 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right=
: 0px; padding-bottom: 0px; padding-left: 0px; font-weight: bold; ">++</spa=
n> <span class=3D"n" style=3D"margin-top: 0px; margin-right: 0px; margin-bo=
ttom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-=
bottom: 0px; padding-left: 0px; ">map</span> <span class=3D"n" style=3D"mar=
gin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padd=
ing-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "=
>shaderID</span> <span class=3D"n" style=3D"margin-top: 0px; margin-right: =
0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right:=
 0px; padding-bottom: 0px; padding-left: 0px; ">fs</span></div>
<div class=3D"line" id=3D"LC249" style=3D"font-family: &#39;Bitstream Vera =
Sans Mono&#39;, Courier, monospace; line-height: 1.4; font-size: 12px; marg=
in-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; paddi=
ng-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; ">
=C2=A0=C2=A0=C2=A0<span class=3D"n" style=3D"margin-top: 0px; margin-right:=
 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right=
: 0px; padding-bottom: 0px; padding-left: 0px; ">mapM_</span> <span class=
=3D"p" style=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; mar=
gin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; p=
adding-left: 0px; ">(</span><span class=3D"n" style=3D"margin-top: 0px; mar=
gin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; pad=
ding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">glAttachShader</=
span> <span class=3D"n" style=3D"margin-top: 0px; margin-right: 0px; margin=
-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; paddi=
ng-bottom: 0px; padding-left: 0px; ">program</span><span class=3D"p" style=
=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0p=
x; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left:=
 0px; ">)</span> <span class=3D"p" style=3D"margin-top: 0px; margin-right: =
0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right:=
 0px; padding-bottom: 0px; padding-left: 0px; ">(</span><span class=3D"n" s=
tyle=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left=
: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-l=
eft: 0px; ">newIDs</span> <span class=3D"o" style=3D"margin-top: 0px; margi=
n-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; paddi=
ng-right: 0px; padding-bottom: 0px; padding-left: 0px; font-weight: bold; "=
>\\</span> <span class=3D"n" style=3D"margin-top: 0px; margin-right: 0px; m=
argin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; =
padding-bottom: 0px; padding-left: 0px; ">currentIDs</span><span class=3D"p=
" style=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-l=
eft: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; paddin=
g-left: 0px; ">)</span></div>
<div class=3D"line" id=3D"LC250" style=3D"font-family: &#39;Bitstream Vera =
Sans Mono&#39;, Courier, monospace; line-height: 1.4; font-size: 12px; marg=
in-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; paddi=
ng-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; ">
=C2=A0=C2=A0=C2=A0<span class=3D"n" style=3D"margin-top: 0px; margin-right:=
 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right=
: 0px; padding-bottom: 0px; padding-left: 0px; ">mapM_</span> <span class=
=3D"p" style=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; mar=
gin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; p=
adding-left: 0px; ">(</span><span class=3D"n" style=3D"margin-top: 0px; mar=
gin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; pad=
ding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">glDetachShader</=
span> <span class=3D"n" style=3D"margin-top: 0px; margin-right: 0px; margin=
-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; paddi=
ng-bottom: 0px; padding-left: 0px; ">program</span><span class=3D"p" style=
=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0p=
x; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left:=
 0px; ">)</span> <span class=3D"p" style=3D"margin-top: 0px; margin-right: =
0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right:=
 0px; padding-bottom: 0px; padding-left: 0px; ">(</span><span class=3D"n" s=
tyle=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left=
: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-l=
eft: 0px; ">currentIDs</span> <span class=3D"o" style=3D"margin-top: 0px; m=
argin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; p=
adding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-weight: bol=
d; ">\\</span> <span class=3D"n" style=3D"margin-top: 0px; margin-right: 0p=
x; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0=
px; padding-bottom: 0px; padding-left: 0px; ">newIDs</span><span class=3D"p=
" style=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-l=
eft: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; paddin=
g-left: 0px; ">)</span></div>
<div style=3D"font-family: &#39;Bitstream Vera Sans Mono&#39;, Courier, mon=
ospace; line-height: 1.4; font-size: 12px; "><span class=3D"p" style=3D"mar=
gin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padd=
ing-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "=
><br>
</span></div></pre></div><div>-Edward Kmett</div>

--f46d04451a457f4f3c04b0625fdc--


--===============2964010718979018044==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
HOpenGL mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/hopengl

--===============2964010718979018044==--