<br><br><div class="gmail_quote">On Thu, Apr 5, 2012 at 3:28 PM, Kenneth Russell <span dir="ltr"><<a href="mailto:kbr@google.com">kbr@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On Wed, Apr 4, 2012 at 8:13 PM, Glenn Maynard <<a href="mailto:glenn@zewt.org">glenn@zewt.org</a>> wrote:<br>
> On Wed, Apr 4, 2012 at 9:18 PM, Gregg Tavares (勤) <<a href="mailto:gman@google.com">gman@google.com</a>> wrote:<br>
>><br>
>> Where are all the places one would return these invalid objects?<br>
>><br>
>> createProgram,<br>
>> createShader,<br>
>> createTexture,<br>
>> createBuffer,<br>
>> createRenderbuffer<br>
>> createFramebuffer,<br>
>> getUniformLocation?<br>
>> getActiveAttrib<br>
>> getActiveUniform<br>
>><br>
>> getUniformLocation seems a little weird in that passing it a uniform that<br>
>> does not exist returns NULL but passing it a uniform after context lost<br>
>> returns an invalid location? Or still NULL?<br>
><br>
><br>
> We're only really talking about functions that return WebGLObject<br>
> subclasses, since those are the ones that have an invalidated flag to use<br>
> instead of a null return value.  WebGLUniformLocation and WebGLActiveInfo<br>
> don't have an invalidated state, since it's not a WebGLObject.  I'd look at<br>
> these later, if we start looking at reducing other null return values.<br>
<br>
</div>Gregg: after context loss, getUniformLocation is covered by the rules<br>
in <a href="http://www.khronos.org/registry/webgl/specs/latest/#5.14" target="_blank">http://www.khronos.org/registry/webgl/specs/latest/#5.14</a>, which<br>
means that it would return null, not an invalid location.<br></blockquote><div><br></div><div>The issue for me is, it seems like we're fixing createXXX because people currently write code like this</div><div><br></div>
</div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_quote"><div><font face="'courier new', monospace">tex = gl.createTexture();</font></div></div><div class="gmail_quote"><div><font face="'courier new', monospace">tex.url = urlOfImageImGoingToPutInTexture;  <font color="#ff0000">// crash</font></font></div>
</div></blockquote><div class="gmail_quote"><div><br></div><div>and that second line will fail if the context is lost. This type of currently invalid code is all over <a href="http://learningwebgl.com">learningwebgl.com</a> :-(</div>
<div><br></div><div>Well, that same problem exists with getUniformLocation and, as Glenn pointed out in my own code, with getActiveAttrib and getActiveUniform.</div><div><br></div><div>For getUniformLocation it's certainly possible that people are attaching things to the location object (though less common)</div>
<div><br></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_quote"><div><font face="'courier new', monospace">var mvpLoc = gl.getUniformLocation(prg, "u_modelViewProjection");</font></div>
</div><div class="gmail_quote"><div><font face="'courier new', monospace">mvpLoc.name = "u_modelViewProjection"  <font color="#ff0000">// crash</font></font></div></div></blockquote><div class="gmail_quote">
<div><br></div><div>And of course getActiveAttrib and getActiveUniform are guaranteed to have this problem.</div><div><br></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_quote">
<div><font face="'courier new', monospace">var info = getActiveAttrib(program, index);</font></div></div><div class="gmail_quote"><div><font face="'courier new', monospace">if (info.size > 1 && endsWith(<a href="http://info.name">info.name</a>, "[0]")) {  <font color="#ff0000">// crash</font></font></div>
</div><div class="gmail_quote"><div><font face="'courier new', monospace">   ...</font></div></div><div class="gmail_quote"><div><font face="'courier new', monospace">}</font></div></div></blockquote><div class="gmail_quote">
<div><br></div><div>so all I'm saying is if we're trying to fix these issues shouldn't we fix them everywhere?</div><div><br></div><div>The thing is, even that won't save you. Lots of people do stuff this</div>
<div><br></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_quote"><div><font face="'courier new', monospace">// link program I know has "u_modelViewProjection"</font></div>
</div><div class="gmail_quote"><div><font face="'courier new', monospace">gl.linkProgram(prg);</font></div></div><div class="gmail_quote"><div><font face="'courier new', monospace">// Make setters for it</font></div>
</div><div class="gmail_quote"><div><font face="'courier new', monospace">var numUniforms = gl.getProgramParameter(gl.ACTIVE_UNIFORMS);</font></div></div><div class="gmail_quote"><div><font face="'courier new', monospace">for (var ii = 0; ii < numUniforms; ++ii) {</font></div>
</div><div class="gmail_quote"><div><font face="'courier new', monospace">   var info = gl.getActiveUniform(prog, ii);</font></div><div><font face="'courier new', monospace">   if (!info) continue;</font></div>
</div><div class="gmail_quote"><div><font face="'courier new', monospace">   var loc = gl.getUniformLocation(prog, <a href="http://info.name">info.name</a>);</font></div></div><div class="gmail_quote"><div><font face="'courier new', monospace">   // make a setter for each uiform</font></div>
</div><div class="gmail_quote"><div><font face="'courier new', monospace">   switch (info.type) {</font></div></div><div class="gmail_quote"><div><font face="'courier new', monospace">   case gl.FLOAT_MAT4:</font></div>
</div><div class="gmail_quote"><div><font face="'courier new', monospace">     prg[name] = function(loc) {</font></div></div><div class="gmail_quote"><div><font face="'courier new', monospace">        return function(matrix) {</font></div>
</div><div class="gmail_quote"><div><font face="'courier new', monospace">            gl.uniformMatrix4fv(loc, 1, false, matrix);</font></div></div><div class="gmail_quote"><div><font face="'courier new', monospace">        };</font></div>
</div><div class="gmail_quote"><div><font face="'courier new', monospace">     }(loc);</font></div></div><div class="gmail_quote"><div><font face="'courier new', monospace">     break;</font></div></div><div class="gmail_quote">
<div><font face="'courier new', monospace">    ...</font></div></div></blockquote><div class="gmail_quote"><div><br></div><div>They then write code like this</div><div><br></div><div><font face="'courier new', monospace">    prg.u_modelViewProjection(someMatrix);</font></div>
<div><br></div><div>That code will crash on lost context since "prg.u_modelViewProjection" will not exist.</div><div><br></div><div>Which begs the question, if we can't project them from that do we need to protect them from the others?</div>
<div><br></div><div><br></div><div> </div><div><br></div><div><br></div><div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im"><br>
<br>
>> how about getParameter?<br>
><br>
><br>
> getParameter is hard, since there are a lot of possible arguments with<br>
> varying reasonable "placeholder" results.  I'd defer this, too.<br>
><br>
> While I'm thinking about it: does getParameter() define that values like<br>
> MAX_VIEWPORT_DIMS and VIEWPORT always return a new object, as opposed to<br>
> returning the same object each time?<br>
<br>
</div>They should. I've clarified getParameter, getUniform and<br>
getVertexAttrib in this area.<br>
<br>
-Ken<br>
</blockquote></div><br>