<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic A little mistake - it crashes in Developing Games on Intel Graphics</title>
    <link>https://community.intel.com/t5/Developing-Games-on-Intel/OpenGL-tessellation-bug/m-p/964614#M764</link>
    <description>&lt;P&gt;A little mistake - it crashes on glUseProgram, not bind... (btw where is post edit button?)&lt;/P&gt;</description>
    <pubDate>Sun, 30 Mar 2014 12:20:24 GMT</pubDate>
    <dc:creator>Joseph_K_</dc:creator>
    <dc:date>2014-03-30T12:20:24Z</dc:date>
    <item>
      <title>OpenGL tessellation bug</title>
      <link>https://community.intel.com/t5/Developing-Games-on-Intel/OpenGL-tessellation-bug/m-p/964613#M763</link>
      <description>&lt;P&gt;Platform: Windows 8.1 x64, MSVC 2010 x64, Intel HD4600 (4770K), driver version: 10.18.10.3496&lt;/P&gt;

&lt;P&gt;The problem: I got shader linking error when linking a program using control and evaluation "Type mismatch: Type of gl_TessLevelInner different between shaders." If I comment out the line in ES where I read that value, whole program crashes (Access violation) when trying to bind this program via glBindProgram. Tested on several nV/AMD GPUs without any issues. However, other very simple tessellation program seems to work.&lt;/P&gt;

&lt;P&gt;Control shader:&lt;/P&gt;

&lt;P&gt;#version 400 compatibility&lt;/P&gt;

&lt;P&gt;layout(vertices=1)out;&lt;/P&gt;

&lt;P&gt;uniform vec4 LightPosition;&lt;/P&gt;

&lt;P&gt;int GreaterVec(vec3 a,vec3 b){&lt;BR /&gt;
	&amp;nbsp; return int(dot(sign(a-b),vec3(4,2,1)));&lt;BR /&gt;
	}&lt;BR /&gt;
	int ComputeMult(vec3 A,vec3 B,vec3 C,vec4 L){&lt;BR /&gt;
	&amp;nbsp; vec3 n=cross(C-A,L.xyz-A*L.w);&lt;BR /&gt;
	&amp;nbsp; return int(sign(dot(n,B-A)));&lt;BR /&gt;
	}&lt;BR /&gt;
	bool IsEdgeVisible(in vec4 A,in vec4 B){&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;vec3 M=+A.xyz+A.www;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;vec3 N=+B.xyz+B.www;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;vec3 O=-A.xyz+A.www;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;vec3 P=-B.xyz+B.www;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;vec3 NM=N-M;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;vec3 PO=P-O;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;float Left=0;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;float Right=1;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;for(int i=0;i&amp;lt;3;++i){&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(NM&lt;I&gt;==0){&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(M&lt;I&gt;&amp;lt;0)return false;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}else{&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(NM&lt;I&gt;&amp;gt;0)Left=max(Left,-M&lt;I&gt;/NM&lt;I&gt;);&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else Right=min(Right,-M&lt;I&gt;/NM&lt;I&gt;);&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(PO&lt;I&gt;==0){&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(O&lt;I&gt;&amp;lt;0)return false;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}else{&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(PO&lt;I&gt;&amp;gt;0)Left=max(Left,-O&lt;I&gt;/PO&lt;I&gt;);&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else Right=min(Right,-O&lt;I&gt;/PO&lt;I&gt;);&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;return Left&amp;lt;=Right;&lt;BR /&gt;
	}&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/P&gt;

&lt;P&gt;bool IsFullVisible(in vec4 A,in vec4 B,in vec4 C,int Diag){&lt;BR /&gt;
	&amp;nbsp; vec3 a=A.xyz;&lt;BR /&gt;
	&amp;nbsp; vec3 b=B.xyz;&lt;BR /&gt;
	&amp;nbsp; vec3 c=C.xyz;&lt;BR /&gt;
	&amp;nbsp; if(Diag&amp;gt;=0){&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; a[Diag]=-a[Diag];&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; b[Diag]=-b[Diag];&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; c[Diag]=-c[Diag];&lt;BR /&gt;
	&amp;nbsp; }&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;float m=(a.x-a.y);&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;float n=(b.x-b.y);&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;float o=(c.x-c.y);&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;float p=(a.x-a.z);&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;float q=(b.x-b.z);&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;float r=(c.x-c.z);&lt;BR /&gt;
	&amp;nbsp; float d=(q*o-n*r);&lt;BR /&gt;
	&amp;nbsp; float t=(m*r-p*o)/d;&lt;BR /&gt;
	&amp;nbsp; float l=-(m*q-p*n)/d;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;vec4 X=A+t*B+l*C;&lt;BR /&gt;
	&amp;nbsp; return (t&amp;gt;0)&amp;amp;&amp;amp;(t&amp;lt;1)&amp;amp;&amp;amp;(l&amp;gt;0)&amp;amp;&amp;amp;(l&amp;lt;1)&amp;amp;&amp;amp;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; all(greaterThan(X.xyz,-X.www))&amp;amp;&amp;amp;all(lessThan(X.xyz,X.www));&lt;BR /&gt;
	}&lt;/P&gt;

&lt;P&gt;#define MATRIX gl_ModelViewProjectionMatrix&lt;BR /&gt;
	bool IsVisible(in vec4 a,in vec4 b,in vec4 c,in vec4 d,vec4 l){&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;vec4 A=MATRIX*a;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;vec4 B=MATRIX*b;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;vec4 C=MATRIX*c;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;vec4 D=MATRIX*d;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;vec3 n=(MATRIX*vec4(cross(b.xyz-a.xyz,l.xyz-a.xyz*l.w),0)).xyz;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;ivec3 Corner=ivec3(1+sign(n))&amp;gt;&amp;gt;1;&lt;BR /&gt;
	&amp;nbsp; if(Corner.z==1);Corner=ivec3(1)-Corner;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;int Diag=Corner.x+(Corner.y&amp;lt;&amp;lt;1)-1;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;if(IsFullVisible(A,B-A,C-A,Diag))return true;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;if(IsEdgeVisible(A,B))return true;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;if(IsEdgeVisible(A,C))return true;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;if(IsEdgeVisible(B,D))return true;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;if(IsEdgeVisible(C,D))return true;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;return false;&lt;BR /&gt;
	}&lt;/P&gt;

&lt;P&gt;patch out vec4 P[4];&lt;/P&gt;

&lt;P&gt;void main(){&lt;BR /&gt;
	&amp;nbsp; int Num=int(gl_in[2].gl_Position.x);&lt;/P&gt;

&lt;P&gt;&amp;nbsp; int Multiplicity=0;&lt;BR /&gt;
	#define PLL LightPosition&lt;BR /&gt;
	#define PA gl_in[0].gl_Position&lt;BR /&gt;
	#define PB gl_in[1].gl_Position&lt;BR /&gt;
	#define PC vec4(gl_in[0].gl_Position.xyz*PLL.w-PLL.xyz,0)&lt;BR /&gt;
	#define PD vec4(gl_in[1].gl_Position.xyz*PLL.w-PLL.xyz,0)&lt;BR /&gt;
	if(!IsVisible(PA,PB,PC,PD,PLL))&lt;BR /&gt;
	{&lt;BR /&gt;
	&amp;nbsp; gl_TessLevelOuter[1]=0;&lt;BR /&gt;
	&amp;nbsp; gl_TessLevelOuter[0]=0;&lt;BR /&gt;
	&amp;nbsp; gl_TessLevelOuter[3]=gl_TessLevelOuter[2]=0.0;&lt;BR /&gt;
	&amp;nbsp; gl_TessLevelInner[1]=gl_TessLevelInner[0]=0.0;&lt;BR /&gt;
	return;&lt;BR /&gt;
	}&lt;BR /&gt;
	&amp;nbsp; for(int i=0;i&amp;lt;Num;++i){&lt;BR /&gt;
	#define T0 gl_in[0].gl_Position.xyz&lt;BR /&gt;
	#define T1 gl_in[1].gl_Position.xyz&lt;BR /&gt;
	#define T2 gl_in[i+3].gl_Position.xyz&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; if(GreaterVec(T0,T2)&amp;gt;0){//T[2] T[0] T[1]?&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Multiplicity+=ComputeMult(T2,T0,T1,LightPosition);&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; }else{&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(GreaterVec(T1,T2)&amp;gt;0){//T[0] T[2] T[1]?&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Multiplicity-=ComputeMult(T0,T2,T1,LightPosition);&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else{//T[0] T[1] T[2]?&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Multiplicity+=ComputeMult(T0,T1,T2,LightPosition);&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;
	&amp;nbsp; }&lt;/P&gt;

&lt;P&gt;&amp;nbsp; int AbsMultiplicity=abs(Multiplicity);&lt;BR /&gt;
	&amp;nbsp; gl_TessLevelOuter[0]=int(AbsMultiplicity&amp;gt;0);&lt;BR /&gt;
	&amp;nbsp; gl_TessLevelOuter[2]=1;&lt;BR /&gt;
	&amp;nbsp; gl_TessLevelOuter[1]=gl_TessLevelOuter[3]=gl_TessLevelInner[0]=2*AbsMultiplicity-1;&lt;BR /&gt;
	&amp;nbsp; gl_TessLevelInner[1]=1;&lt;/P&gt;

&lt;P&gt;&amp;nbsp; if(Multiplicity&amp;gt;0){&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; P[0]=vec4(gl_in[1].gl_Position.xyz,1);&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; P[1]=vec4(gl_in[0].gl_Position.xyz,1);&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; P[2]=vec4(gl_in[1].gl_Position.xyz*LightPosition.w-LightPosition.xyz,0);&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; P[3]=vec4(gl_in[0].gl_Position.xyz*LightPosition.w-LightPosition.xyz,0);&lt;BR /&gt;
	&amp;nbsp; }&lt;BR /&gt;
	&amp;nbsp; if(Multiplicity&amp;lt;0)&lt;BR /&gt;
	&amp;nbsp; {&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; P[0]=vec4(gl_in[0].gl_Position.xyz,1);&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; P[1]=vec4(gl_in[1].gl_Position.xyz,1);&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; P[2]=vec4(gl_in[0].gl_Position.xyz*LightPosition.w-LightPosition.xyz,0);&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; P[3]=vec4(gl_in[1].gl_Position.xyz*LightPosition.w-LightPosition.xyz,0);&lt;BR /&gt;
	&amp;nbsp; }&lt;BR /&gt;
	}&lt;/P&gt;

&lt;P&gt;----------------------------&lt;/P&gt;

&lt;PRE class="brush:cpp;"&gt;Evaluation shader:
&lt;/PRE&gt;

&lt;P&gt;#version 400 compatibility&lt;/P&gt;

&lt;P&gt;layout(quads,fractional_odd_spacing,cw)in;&lt;/P&gt;

&lt;P&gt;patch in vec4 P[4];&lt;/P&gt;

&lt;P&gt;int GetIndex(){&lt;BR /&gt;
	&amp;nbsp; int x=int(round(gl_TessCoord.x*gl_TessLevelInner[0]))*2;&lt;BR /&gt;
	&amp;nbsp; int y=int(round(gl_TessCoord.y));&lt;BR /&gt;
	&amp;nbsp; int id=x+y;&lt;BR /&gt;
	&amp;nbsp; int l=((id+2)/4)%2;&lt;BR /&gt;
	&amp;nbsp; int t=(id%2)^((id/4)%2);&lt;BR /&gt;
	&amp;nbsp; return t+l*2;&lt;BR /&gt;
	}&lt;/P&gt;

&lt;P&gt;void main(){&lt;BR /&gt;
	&amp;nbsp; gl_Position=gl_ModelViewProjectionMatrix*P[GetIndex()];&lt;BR /&gt;
	}&lt;/P&gt;

&lt;P&gt;---------------&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sun, 30 Mar 2014 12:10:19 GMT</pubDate>
      <guid>https://community.intel.com/t5/Developing-Games-on-Intel/OpenGL-tessellation-bug/m-p/964613#M763</guid>
      <dc:creator>Joseph_K_</dc:creator>
      <dc:date>2014-03-30T12:10:19Z</dc:date>
    </item>
    <item>
      <title>A little mistake - it crashes</title>
      <link>https://community.intel.com/t5/Developing-Games-on-Intel/OpenGL-tessellation-bug/m-p/964614#M764</link>
      <description>&lt;P&gt;A little mistake - it crashes on glUseProgram, not bind... (btw where is post edit button?)&lt;/P&gt;</description>
      <pubDate>Sun, 30 Mar 2014 12:20:24 GMT</pubDate>
      <guid>https://community.intel.com/t5/Developing-Games-on-Intel/OpenGL-tessellation-bug/m-p/964614#M764</guid>
      <dc:creator>Joseph_K_</dc:creator>
      <dc:date>2014-03-30T12:20:24Z</dc:date>
    </item>
    <item>
      <title>Hi Joseph,</title>
      <link>https://community.intel.com/t5/Developing-Games-on-Intel/OpenGL-tessellation-bug/m-p/964615#M765</link>
      <description>&lt;P&gt;Hi Joseph,&lt;/P&gt;

&lt;P&gt;Thanks for bring this to our attention. I have disucssed it with our OopenGL driver development team and they will investigate the issue. When I have an update I will let you know.&lt;/P&gt;</description>
      <pubDate>Wed, 02 Jul 2014 17:01:00 GMT</pubDate>
      <guid>https://community.intel.com/t5/Developing-Games-on-Intel/OpenGL-tessellation-bug/m-p/964615#M765</guid>
      <dc:creator>Michael_C_Intel2</dc:creator>
      <dc:date>2014-07-02T17:01:00Z</dc:date>
    </item>
    <item>
      <title>Hi Joseph,</title>
      <link>https://community.intel.com/t5/Developing-Games-on-Intel/OpenGL-tessellation-bug/m-p/964616#M766</link>
      <description>&lt;P&gt;Hi Joseph,&lt;/P&gt;

&lt;P&gt;A new driver has been released that has a fix for your issue.&lt;/P&gt;

&lt;P&gt;&lt;A href="https://downloadcenter.intel.com/Detail_Desc.aspx?DwnldID=24245&amp;amp;lang=eng&amp;amp;ProdId=3720"&gt;&lt;U&gt;&lt;FONT color="#0066cc"&gt;&lt;/FONT&gt;&lt;/U&gt;&lt;/A&gt;&lt;A href="https://downloadcenter.intel.com/Detail_Desc.aspx?DwnldID=24245&amp;amp;lang=eng&amp;amp;ProdId=3720" target="_blank"&gt;https://downloadcenter.intel.com/Detail_Desc.aspx?DwnldID=24245&amp;amp;lang=eng&amp;amp;ProdId=3720&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 12 Sep 2014 21:35:11 GMT</pubDate>
      <guid>https://community.intel.com/t5/Developing-Games-on-Intel/OpenGL-tessellation-bug/m-p/964616#M766</guid>
      <dc:creator>Michael_C_Intel2</dc:creator>
      <dc:date>2014-09-12T21:35:11Z</dc:date>
    </item>
  </channel>
</rss>

