[Beignet] [PATCH 2/3] BDW: Refine intel_gpgpu_setup_bti and add intel_gpgpu_set_base_address for BDW.

Yang Rong rong.r.yang at intel.com
Sun Sep 28 22:38:11 PDT 2014


Because the sizeof struct surface state change in BDW, remove gen6_surface_state, and
use gen_surface_state as the unoin of gen7_surface_state and gen8_surface_state.
Use gen_surface_state in surface_heap_t.
Reloc the Dynamic State Base and Instruction Address in intel_gpgpu_set_base_address_gen8.
BDW use 48 bits GPU address, so when reloc address, remember that kernel will reloc 64 bits in
command batch, so make sure there are 64 bits address, the high 64bits follow by low 32bits in command batch.

Signed-off-by: Yang Rong <rong.r.yang at intel.com>
---
 src/intel/.intel_gpgpu.c.swp | Bin 0 -> 81920 bytes
 src/intel/intel_defines.h    |   1 +
 src/intel/intel_gpgpu.c      | 186 +++++++++++++++++++++----------------------
 src/intel/intel_structs.h    |  78 ++----------------
 4 files changed, 97 insertions(+), 168 deletions(-)
 create mode 100644 src/intel/.intel_gpgpu.c.swp

diff --git a/src/intel/.intel_gpgpu.c.swp b/src/intel/.intel_gpgpu.c.swp
new file mode 100644
index 0000000000000000000000000000000000000000..61a705e3f41582fd9cf855655fe391dea4be8617
GIT binary patch
literal 81920
zcmeIb2Yh5#dH<~hY<e}ln2Y_|NV{6C+G at 4cQQNg_t+Ys57mRZmjYiUVM>F!wXti<!
z?0^k~518hJmH+_)gg+tl5)(=if+=>u6jMy7AsG0>O9-9!`#k5|d(SO1(yrG8UNoQ2
zPcypr)aTTvoafARo;P~H+uqUJ!smf4EpPsK>+~mkpV at M^ww9LsLT+)XRw>J?W}hJ3
zmf1q>aJ{nBDC|{1z^%2)ay4JrI#Vdlmkaf+wQ7EAv0N{d%wK<gX?|(BBi|^UjprK_
z*r32MQee40x26AnEj`^`of7l((;n}g^58?qn8-%(4GL^fV1oi16xg7^1_d at Kut9+h
z3T#l|_n89qr3be>l?wc^twh~^|54)m?)HBPE1zZa)e?j|$^JiRzki%~f3p35-hTJl
zh(Y{&*yjuO`xS}z_q5N0@||Q09K^queP6TRtBLpbw$C4Hzwb!Af3SVN%YNVcZstdj
z{(bCom6Py$IPv}z`@Y+LuO{B#*FMkN?>8pi-_JfT*zfyUf(QBE-#!oMQ%$^ofPMdT
z`+ZyDJ)#}`TxGv6vJDob{~-Ik&whU)@!l4<C8);(Y=Z{zZM2QA4GL^fV1oi16xg7^
z1_d at Kut9+h3T#kdg8~~A_#LG{ZnmXGSjGP<j2uj2z+e9ghVrxE)8GYQ8axEt3?upp
z at N954xEr_`=JgZcSzrg~1HXb%{1@;c at Iml@z)Qh1K^6QdI0y8A$AWu<pTJ~)9efRZ
z7`z%h9XuKA1`h!D2S0_G{~Guh_&4wmU<K?3e+2#oVZaB#jo^jgFc<<JcpUgS!i1lJ
ze+I7y*MalF2p9%W01p8FgHYl-;Pc>f;2**J!LvXGl))h|4f?@$a4NVDxEJ_uc;qjF
ze*td+*Mn8C8GHi%`by9Twt*kf2(JgP13B;%&<`F2z76yJesBa_2<`>$3BHO9<5uuC
z at E71Ja1q!H9t|D^enGox+iL&w_|)pv<$T?{yv6gDF}mpK_UqnKq3YKcs)gLFU&~i>
z_51>I5YM~P%Pk-ED|2(TLVXwiJ27gQhLngkQ>o7Km9La4Rliox)eFtTHwjXlt=6+6
z=a;K9jnZAN&gJq2f1!|Daw0pG41RjE)kR;eOenOsX{NHv)^BEcPHQXm(@#8Lk&st<
zOI4!I`7^srkgc1%`a;1z^+>_Xm1n(TdA4v={@b**B_eb><EAeuRlT at a5MnMaX@-&+
zPiQ%wNb+-qs<%cKq>`_ciBYbT##$NLMqfurdWukC%>?VY{9y at 4z~ypH%zS3OQl&ia
zg&n6 at U(798a(aBIrG4iu*K+d(Z$?9ONKM^TXa}#jI8ReTY=0(KE5s9#C$=T#Dpi6?
zS~b&6I+SYh0!dmXD<>UWAQL&WIKj}Fk#fxX<wRsjK<iXqUYw!1Ds#5sYSc?&m<9|-
zpiRb%wTl*W)NFaqFJG+5n%-8FRAeaDsGfE|9T%|<5vEtqRp$#dJ&B~#Bt01j)pD+6
zlk|jCre}o(lt<FZ^SM&Vlr}yvY>|l-FE6P}j5SlsmyDs8f0&XK$bxU_SW>hS4a+QK
z(qMwxr2j^5XRE~{GG}?4W~)c!@sUb#c2h7)i{-hBcG2Qx1;WgiDl at r~zjD~GU3O8=
z#ZhoF^eaobOP33~S}t#~6NSlMP0(7X%GnI;Qo-AQaR0$WG6L%b?T`i9)w^8UDd^B;
zZ;#j2=UqvkH!nSTE4 at qKboVFTP`BWXL?Wy6h1O;5A6}(gTJ>^Xskm6I(^=BJNJho!
zvxT{0x!@fbxWFIX=MRre4N0%-K?r at NC1c@8ff+z&Zz`r0Sgr{L;%!;4NmoffHx00>
zrM|jUAT#3Y;$di{X?vGTW_Em;X;^c^)~^~ozNmX!-=-RkQJHI<FO>Ztw35 at Ww`r4v
zU03>5u{`hBb2FuaMCElN{~!UG^(g?fo2pl;1-fpfzMupo0Z$XC>C9{+m<FtA3kJlS
z9z8HJH9c_Ppg%A?JSp^(Pv_C at o^AaRiKhrKHZtiGa(cv{8hz4;glg^TYl~W8!k-+O
z9vB_>2S=ynt$td&yxqIK?*3S~>8V&4324LhM&b64jQc|ehW!I0!=nTK#Nat2LnPbU
zd31YMr+(TfUIALog+&+|BlH0q)*n4Euz#d`*dLgj9JtVw#`)WMw5xMpPqV09!~Wo*
zefvg2q6D!uYTp`Bo8-E!dDI}A#JA?!+j4qwj`?%Wqps(TOiqnXjQd?aJ^u7!IbT|y
zEqJFfvDiV`v2a at a`EtEjs->PXT~+e()Cs&)t;|<*i#+wVZq?~=aC(#mo*J1vZ)DgX
zKXkwetmDBNubQbTo`?J1nb;Z!GUF^!Qa2Sd@|y%OHng!i?JiWS<x0oG-l*ieYxP-@
zia(pnm+PhYquOe1tBlt4QyG~Q!%cI!TqN1}GZv%DQZjmdwp5&nhs)J!g=#7so3HtJ
zI5H?|Ra$gu+7$Mcfl}dUq3BIjmY0f$D at VNDIepN9$+1586QyEDzOuNNsNTSGeW6m_
z=?xajm*f^%SEmZ|l_SNRw|mAu>8P0}@rV+4te7v9*=*!=W3y6Z>ZvajYfRcR)m(M8
z!yBFR%9VP%S1S~}-3#^l($1}0S5{U!=F7_+mFoP~l1ZSpb#I5HcVT7Ot1VQPOS9fW
z?nuF_7V-s_xmnhMd}V1>_7Jij?;k(pjTMAW-u^<lP-PK6xI9Bzq at l&idKVT}R`o^Z
zN^iDM&&gnrC<jI+ht3`tpB at +-9UGm#&?C&g(dqG#sVQ&Y#H2Ui9UPdP9vwO~HZbWO
zJT!T5VrrzrgH(l}K$6JJa@{+Bbo%UxL(|^C_=Vp2G6RfHU%1N?(o}dW3x>uh!aNkI
z*h;QiWrr$NlN6>M>Uj`ymVQ(%k}g5*mS>@|B$?*e1J+4b_8A5Ci-o!6QaedVDr^jD
z#Y)-h4hUx3sa>koO3YQP&pmo0f!bIdR=pCddNqir1PPnA<}C?rYYP-%W>pKnuS&hA
zDsy#8U-0%-mdmp_No$u^pq_=Qlwq;Lw7e>1<Sl7SyOGCYEhtm7MoiIRPI9c-9Cu0i
zb)!%%L<Ewo*r{x-NcK{KA$m-;IKNQ$KJ*5!yR)m?8<l+(&#OxnSUd{My4fQ9|8?-|
zp8>-E!-nhUMtJ?Vf-AvUU<ddTy#9;81>nKpHsXBN#{IO!-}r1$V1oi16xg7^1_d at K
zut9+h3T#kdg8~~A*r32~l>%3`pt=KrC|yNCK8k~7^hxz1a%z=<Sm}HC+($IKT|~gC
zc&cUbbF;IESZnF%vDXb!S*q0Pel9O;XCeXTO at p|i$Otr4s`W{vkb3W=6Dk=bP(GJm
zDERq$wL}W74PN>A8E;dYOQCpFCvijMIJs1bia5Pmm`@bbdE=xJk4<CvV?Bw8=Ajek
zO0Q5t?sU1fRXhPFlSC at c8yal2UPbz|OZopx>7CC)S1kO0VBi0B`2ClG>%sHEx!`QD
zA3PR327C$`z$?Kkz>~l!K;!~9A`7?%Tn%=D-yl@@H4vMCcY_)b8-RO)H=)n3gBq9z
z=YmnN7u*w^3{C<c6}>)q12_Vf!67gOCc)#tW5I*L?dbTw488<z2CoON1<wb62IfH*
zcm((sdj5}tzXVSM6JR^I2lzfZe9`&88U*_ODSkf=h at St)=<&Y>z6x#!{|5dByc%2s
zt_Ble7q|!b0eb%LgZ~7d2e*K?gTDbcfER-of$P9|U>fv-JFo%x1h@%&47?Zo1$YU#
z8axd=6;!|&I0tM2o57>O&#)EvAMhFQ at 8A~j&)~V>IiMGu0=`5akbZET^o8H{N0p_W
z?IO}dnImep1BFFzV&)QWXsF#hDaq`U{d6FomzU>P(Uy6G=$?(j5>cc-I50hQcB{^T
zTlT8(z1<VFiqYf at 4or=x;zwkiS9twxG64>b>=!LgM#Qd84WO#^$b13`x}VQ8-Wp6P
zt!=wJbW{Y(Etl%vkW51e;>z`ErQ{vSm6lbfczKIE>ByiLRdz7#>hN!ML!kWBTD7%^
zWWJbJ9VikzDo|yvuOe#A=lxPC?-%&$p>~UP`EO-Lw4H8B=?SjCHB2?o%ee`Y3`rOA
zq*?0GUu!41eOpGFZlboZrJi-9)hMZf;qwN at hek5mPTQ?ne>gaLaAa(B9Od4~m}uIr
z at DfjqB5th?!uvRJYlTuFU-y at aONA23+VwW!e5GFT3P+2oOjSiG{cHTt*qC%sxAA64
zzg}q7AY_h?2Yp7=2lP3QNol9pQ5Xe_32w)OR!PIz2jR-$=&Jm3VI_!#&fSf}zr?VL
z`02?D{eiKui6MV{!XKHO^h_kioIZ_Lzl~%P)uC6%Ya6Ggl)}_LW&#lQR+lpMO=dJO
zDn){B<^V0Y3FX$#Qqi3zOxfa^a(}s8Ent3ADCcc at TlPkFHXSn+lRRo}abc5uCv{yr
zy<n>|6D8*b>BZiyFEwL{la*HVW?d;6)1Qolq8IB*M{LTlE67O5d9$vR0;8-BY_t-D
zkG(p!#2Tl?n{_4S+HXbG4B9aHR+BU{wvO#N+uGh9GvM126N>Gsv7X*|DQME)TH`h#
zZ8VCdqSq?F$ybJ=U0Gt2jt&FXCv0 at 2EnCI>1|uDb<WA}CaN4rBl!FJrnl57)qz08H
z9YzU at m6>3&pqpIMkg`)w_f52ZYLOF!TFDjbY~n?Ghw`~~9kg=OuC12yE>Rphw#1g+
zi2I^Au at oG3EtvMb^?ZW$+7pAD_Q?894RVxy;vqSy;V0VQ#atco1_n0Tkg-YHDPdde
zML at syge?)hz{x at CB!*_z46Qv?{rD~?O at -L|a1Cr)-dGgui!zH%rQ>CB8KgupoL8w5
z2rc`1F*A$h;>3^wI3sO&ZgC#-O{m1T6vAzFml;l!!FiP`L%P+R(2WStE+g9Xg3 at wr
z!AECZNR}tfS|>`C3Xm#W*w<q8NyU>=hC!w4CW~UZ;6(oBX)4n+L4xSnox$m_7!&xl
z(xPM^bh4P$n@&No$&f8t3l at Bib+lOi8GGuQwF_nY&qM40q+`_Bpks7c6T1d$R6wq3
z(@QE??qcsO={YG1Mf`lt$C|IYN}8l6kHnmyf(4*HrcmCtu5OH3kq;CWd8U?bv2-vb
z43a4pFa#9+|05X)d#wHcpym6X3V)vmj|3lur~f<fI#2|=f$;kO1#iCu?hoD!FFyvv
zj{g_%>o<TNa5MaP87zQaa2q`L)4?wAYk2IBftP@*fDbMPPX-6UBf!Ie at Zc{6PXS_E
z{}=GmN5Ov32EGiB{A^GHv)~Ny6ZqawfxiX2!DGPp;Bo&Iyb7EJ9tYkJulsVa9sB|s
z+zeg|E(SuA-Jsz|DBFmoFpQ#v2tJ+OW~}$%D_SkTh+SZBoBZD?CW2jUS9mTr>K~XG
z9^H4LY>|T$%=hSyu5JE)%>0HY4v4kk==jw1<e{NyEa5PLiG9`#Dy5$sVYeP^PITRE
zr-(6Q`8K=mVlWGfP%+tT-P*A38I{bcnsUXXSgDIqsYnI~#ddoDIiqLz_qEA;f{HL(
z#Mr8?;)bXUYAn8X5h98oSL at 199$qbDe3rL at k5mbw9Fh$>IWj&xGPzc>yP+DjxNYHR
z3vLo^NZ(YqbP_NY=N+z<u3i4`q9I_dbJwCnEZ8v;!t%}QtK}J9Z|9Ca*}#X>fbC3J
zW-Zs$I2jR8V3jOp%q`l;SkW2lXJfqVEmd^?<YBee)y2Ddtpn4uc5g*Z#W5}v+qWQ;
z7|cmG#&UdRp;#(tlJqX@$|Y3JSU-CrRq_I1eqiM97KN1s_SPFcZxDf&967;yEl3Lq
z-Bdz4x8_id&jy%G+rG0_-)i_ip5Qv>(BKqBU at vK^5RJ2Nx`A3JS_av80%<6P?CP}?
zY9fg2vqAosM3Mcm-5i at T9T=e)M)qHZ6KpDxGv at 0u10F&QyYJB06wZisq%>>$%%y}5
zdP3tIos$oC_H?#J8H%B2Zq;Ki%hoGjsp=YHPQ+oc%Za!SW6FssYtB1duB?<X?5)nK
z-RR8nydG_0*mJzALI4E8Fwrw&Piln17_5pt=}NH%A14;1ZqmV^*Aid at TP<9|&}Ty_
z2hp$)g&vR<xi|;(biS#0i-lUwEAHsq2E!)DXDH(=DKnQWF4s64LNz3pS-Ths&&ot$
zB<ssdNO?@*j*HT#i^i&1%%h#X=2Sx?dP{ZOy at D0_AJT#iD%G0zoOR~lYz6L`EaHp(
zU6V(AqRY;MgA~rNGyMgNb-Dw#+Dn*ga~5gf(4aTRQlh;?4<l(8saNV)oht)E*X`>)
zFu3-pb#}e|vg^$pRLMqmrs(F48($LE%D`#kD2Ef5LA-?%Ie6h`eS3*C)1b9;$muMA
zJ?mp4lH16JEW{cCWyZ~7ADo&Y=RgE1JF`2tgVNS%x_dg&dne|b6SQ+8rH1>aW{Z~7
z#>dg->)P}P{|}4Z@=wC&qW_<_%<lW)``-*i-~S)*`d5HQ0MYM at t^W#m4EPNE{)@qR
z;Njpm at cdr^UjknQuLOSvt_DvBL!ccz1jsr5Tft|*2f)k0v%z)XTCfWCfnjhOI0^hW
za)a*!(eHl|h&<ur;AP-1!8m9EzoAmMfxiSITUZ8v3PiSW5fDB9so*i-Zs6<46<!Bk
z3!VzPKnu7H`NG at 5OTY`jvp^9Pz(c`@kTr<@{(3M4<ShTg!OxI4h!4KcgU^ARzzyKV
zU>Wp+pCW&F2iOl<!I|I;@JR4I<PqNmH-YDXgJ27gcKU!LlQ6rU^^HNV*=Uv?>I_ at U
z!Z~O1b-&rDx9TCsZB2u~357GC^MkRmICEL^<%5lKYj=BRd$&qUdc7 at PH#~%_6{SLX
zzP_-f+r)3YU6u`XT#;C+;Os!EcS1I at cX2bg4iK6W*_9=Wh}A at th1v*s+L%Fmx|=4^
zpq+%;>u#v7ctf3lmNFG#F+ury0$VK0#>24eje7c>dAnxoXv0A0sM(qij5P`)o1#Fl
z=ZK^kKQxet9Qz{iqb at L=NArgDl*SHa*d&8MT4l`0j3rU*0O?%w at CPfo)hlLJmss2N
zU!VU8pc9EvD3}U}QA!gAP3s-nw3)!s91$qJRe7aBqjz3vQgek}QMlyP=Z0Ei7ZYSJ
z`gkK at 3ZAUX7%^x7_@{)A6|G7!v=vAP at b)4<@-7#BX`}8K9S}G6Oa~`M$EP_KEv?kQ
zMW#t2H=Y-by;GnEiq$J~!aOpkj!CdLar<%;_CK^min_Fv$XGD)BYZF2Egr`6=8P5}
z3lg-j)pqYRIOj6VY`YmCh5;!Y%@<&Ml{wL4jU7)epJqvmk*B(jQBGyAcIoJWr7RUm
zyg-}e)=uWpc<F*B#pGqn-r2$tj`6aTm^?`>%7T>ankvsaq!@wrWtExOeV0_s#8<1t
zT<#VxMSRR%cyFXHA$d6g+9!m!Y<T#5$Bynmzc4!GBl7e2Pj|8J4C*8X5Acbtyc`_3
zaC&lJbj+W2-g{SEkyuzW$QA1KqI3hxg3Q9|xH83JcxdCDi5-#XyJYHWqj~WCvU#%!
zvUO`2)xlC_g%iIL#+Vm~k(3EUAKSW>Qn6XcsVD at 68MX3^khImLyLT_%JKA)>>ASGV
z!5Hr}nQ0;Rn4Y(HFGAT}ElyBzTw>-vp+ampsr}xzgo;zfw#;_cUQZL>>UDK?%O2<0
zl5UW)=N+d2uJM%9xh~OI!x`(h6P?j at B1Cg{opA216wlqMwhJV6%@R3LvbsB;ha<_!
zmU78JZ?t%Ju1h2sm*(76xg3|oPCL<^lGzFW4~yS&ljZ*xEdT!>JiHxz1&AEraxe-W
z4(<)^0Zs<DA`f^CxD=cPy1`b^0ltoW;B(;R;HBU)FaquYZbepbJs1U>!TrF`MJ53L
z2YeU2AG{Y_3wD4<gKr`Oco{e!c;Kt>`hO3e3dFAeY;X$rF+BZ`zz at MU!E3>5z%^hu
z5TVBx;P1t^-}OLz_=#=*Ft{H$8Qcti|0!@CI2Y^&CxKtX-+vUm0sJj^2Dk=X4UT|r
z&<P$09soWHum9(u4{QV9hrfR-cr`c&3<2Tw{|meZ%z;zEW5KU!mtTR~z~{l|fV9=e
zK;jd#F_Trr-6e?mF<$!A<lM4?SgowFI`F>9(24Q$FbtQEZk^hL6amBbT3voj7mn`f
zys|k5gOj7}oOtnv#;3;+CGPJDjPd=6efy?Hrgc-*s1UOG9h(>!mWZQMY<qEebby_2
zmn$3)X at Qi1$~3J`w at hli%Kb`Zrp69P9S%(n?&<38Z}*0W_VjeOdy^CTHMP9Br)x*I
ztz5XNYE)1r8W#1=&Tc80aKoB>U$04jN1rC&#TUuTS3G&ye+5=aO`0T0%I>?8luc^d
zIou<f9Me6hYcR9r#a~I?+v%N+TN2Oyx5w-5<5A!Gddbuihor5$?#h}qW|nr)8ROe>
zYg85-r^;lCGEB>Y&2OY7z0*UrS?4x8(o&C%|GDD498K%KsP|$WT5ERQ%*b8cCiZdm
z%>Si9o>7&qJ41)Ai!$l(`!Gbe+abD+vfkxmu9<wI;gFl>tm^R(x28Oiu!~E182gp3
zj$&k-W>1e6%c`eG^o1>^cqoL&hg0*sAj)jspHq9<?AO?EvQXo<DiN(-ILetV)@VJW
z8s>skT!Va!Z8}~O)zPPk);QzNSXIQZl>+FBA*Y=Dp^5S7$%!%7meAk7?}Dga@%X`E
zrpz>Yh8snzEQ!TIW~7OOLleUze$Q}FltyXPmS>tIGj(XNX-Y<4KncWy<HWw6Zt+Li
zr-!qG-4TY!vSpC`7YmEb at U2VvcF~Rqca8(gO-uQ}fXU3-?lB_uB<R<ca7i2piL6DX
zjh&U9PQ)26 at MkKA3bTs1DS0R)w!d>%lazQUT6E&0py^I)4MDTU_3S6ztM-pg3=WJT
zS(^6GpB$YYVT)FrJqn9%i6RmdF`*CWY7$C{Y+WUFO6u#rq~&CL(nKkiID#Wm-9{Ul
zbZxW>e&{x|Dcxj;>JBgw%Whj+EGwF{_)cR*PPY0|Zf1|gr3O<UbQH?Q&9K;ljo?LA
zk240Nt0pE#nx@)wAf047spIALkh+ at IJcNG`yCkD at F@BiU%$?n=?3DYtNm?AGvaOZ>
z7$N$*x3_;s at VmdaH~ih(+dI%Hl(x}(yKE>T_jU)r`(wXJIgFv!K_(CV>BI<AA~wH+
z?N!1wE at S!czUX2Gm<ZuyxKl9oteWdG{|t1&5$x#FJa@<&`<wcuew!F<@jE+vOvyB<
z9ykZBuRM2t_eS;V7g}m4%Ym2}JPw`*DXqU=U17Z_SA3W&6{3Tm!vD*ib;57D{{KG!
zZ~u?r&p`>C0louI{~_=}a2ePG<Sf7z at Dq6YAAt9OcY{koFE|5yAKw1k;H}{K;CbMw
z;3Ciu`oK2O2ITC(&%j5(tH3qjiC{ChJGdR5|6Sk)@DgwZcoNtPP6lER at OR*u;3?n<
z;Ag_?gLi|sgSP=W>puhJtp7I93tGW{!1vz{J_+6cUJt}BK+Ydbf`dS81MUw*P9SIh
z-wDJ%;6>nt;94MO6Gp&8z)z3?+yp)bUIv~Hd at uy=18zqq at K*2~Pyp at Vm&gRZ1l|YU
z1>Om+15W}Mfb+o^kaPPF0$-;6z6f3ct_SCVX|N9jvV?@ZU>*OWf)SsY;xeRjmsj+5
z2PzBe`x~E^n>QClM-U0YlQS1*-NhBW$kAujAGtL>&YZ$hGnd8|o3z=A_)=9{%beHg
zF+)}BV%O*zGMh|f!V-4U5v-d9(OsxjgPB~SFH23k8U=<)wgDy)Gm8YPs at WBA_^WnV
zSaiY}seU?FjuZO1dIeMeSk}6PxXC-Gw at kox&us02Gg^Uzm!@Oe<I`waGYh(e2tF#B
zP~pTO?88~B)sj?beo+1~_E$k*zBy^cY9_*r3H3^^T}A9isU$v_G05cLU+uJX#N at i}
zs$!$`n}u3qbq~)Y8*OcrW^0e^?8J0LKNLM~KN5vhKil2?>bko}l;ngxAnu<JPE1bw
z2S+CNv63Dd56RMi%q@~)V}U}CY53s4 at 0Pt`$wfD*w8i2Tf5^H>%S$<~DYp5RynHY6
zKra)}yxdNd+%jm-Z5QDfL4|X-OF?2YB%_(y+KgkH7d<Qx-9*9JGuoPt5#OqqF~ge%
zBZe|2PaOs;TeLTID`KQ9!9WOmu45c6s-7ICAspf98TLZ%MEfjtnPk%>E|2l7V at 05{
z{lR&z@^47`#9wcrT||U#zOg;E5=%)(f;t$b!_yQ(6iO(Gr%2(9W2^sj(~l;Rb&+IU
zg+pKJ%oK^1NfzhMG*G-W4f>jCs}t1MbjpXsw31BiYiw*JK!Z^k9m<hF`U&K+>zn%I
zOhCrOrv==Y`V7O{B6L08sgKC+K#6SiqEVQ7Z>%n?g;<ktkqJw7Aen7u9LGCm-bpRd
zNw+SI6C3LZrY;S$Wv`y13<UZz8C%O}w at PNtOXb>NN-{Cs{f+j;ti49N$Bi1Kn>A-^
zq|8Yn+}vc(&<%>k#R=htQCvlA*=uBCa=w}^rHakAZe_{}h+&j8$Gxdh`r_(nL(q-$
znK&K(PzBw6$~@~hYP1>zdb9s^LAS0cHEt;3XpPxWaG+lYwUxo>UW1zsYQ;qr$Hd35
znKGL0GeRyc9B{(_!y>o*Q1r>z|JN*6cnkdgr@$w{hrqSq8K4f%0j=OnAaVim5%5D~
z06zdC8+ZqJ1~?B)gDD_)1wI;lA9=tBz+ZwJK;S3vFu$k4E^sOkdBL~9ZQxzt*<cP7
zfZQ7>cLvH?gKvWOfR}@pfh)mNKqrv<0)L52K<)>;9{d?N3+w_rK|44F{3isEGXyt*
zH-Q&`%fJNa0o~vhWCL#ot6&ODg00|w;H$_1UJPCYsz77}{}1>Iy#JTMKY-_hi@;;R
zqrunV`#%Vt3U+{g at MHLX@$+{LSOFITkp=u5{{C~|qu?Xpufa3HW#A}S0f)hF;Prn6
z{u*2i9s#6Xqx=78Tyb+##0!sKKqd%h%gr|dBal4%%>v%&W31vr0j_9cQnxzE$|fh9
z5jGJVUftg4q;W;=X3iKOQjZ-Jm-|x8ZEbDdW|D}%^fu|8PoZ69ROT&vj})u*WzMB-
z4i+7G+4wAaat+jlpG&!vCXL<gMQ&5HBI5l<=()+O%v{2^qwX~iYzZ<}P;2$4mW6g}
z5LE~Ih^wSf2{BU%D~N#5${h%<Q=8cj+w`{Rx*D#$3HFY3U3WsZGi10mOT^QB*p|UJ
zay1fX0!8?8=9vMhlc6cNd at _=^?zK!(fk&;BrSBQFooCGM^v<Y>HE+A;`};=6Mtom>
zsgpi_;Wk2 at -L>kqMn-oa#d|#0J6>@`kTsVKwo0pD-1&Gpj<1Y0A;e*wjssQM1VcbA
zdf7wbng?^^fkPMA8?Y#X=qh{&4)vi$3mwxw at HVR^&6iu)tcQWANVj2z1|s{^ZJBi?
zsnhU5SIr8{)-1eQld=bSO9u&l^LSuvbpN;-w3?FIqaItg1~)6lP7rIF=Ik#Ah<m#6
zMN`MVpJT{!UE?uTu`jrB%iaOHR^3ieb&jnD?lpPg)Mb79sQOK|(dIhQ*#gG9#U-Q$
z4I0Tg7<C-YA+gs at c-uqNf;?^|PA_v`YDWls1o5s%m6+)cW;i9&+m55~8hzcRmqMkc
z_y$CcP4&lGKJmDr>C)TH`k|{&SWxxI5$oYx9hJ|q6B1!EC*6hV3&qLuxVuwaDXGv4
zv8EL?%dl`r%3Q&*5U3bUsu^=$DuNa?I{Fb!`!QL%GqQD&K=L$Y59t$wDVSTv?AFl8
zMQlFQM?~)HFIW`87AzDFI&Y{r1<(f~>Ed6r>|~tN7}873M0TvRt5VloTPxHI*N^a|
zhFJ`lxTX3beG_X6L^dm;$2b41J%39Alot;sc-yM3GKotkFn_~}hNUq}gC$`)@AWir
zB37c6lW(c3)1syvbVDUntUW_#mh0|mPK>akwr1`tN|1btE6sKG<}jhi`)1f}V(*+G
z6CElOKl09hvXI%L=tLKv%j|*|%x%fQiCJ+E9tk7}#KnBm_EnpBa9gXn at s~1O)oO0u
zl(GabxfV{&nK;?RFB~QsPKv_<M>h!b!rjdUTC(6V1sar1BVInVk<CS<amSN-Gd0o~
zFZ;t16^$P=S~3ELd|r%<Np(mVF%0fBNPA069HrZjV!7Br4HgLSiR0?Nl<0m#4WPa@
z{ZsCyvqxu){Mu*{44s1AnLg9-!I2qh1>N)6<~7_hyT8Y~58yzQ-btew&FR?WU7CSO
z&6s($Mujp2b3-VPwOCArv;w~%YMhVHsDC<TbO$DOK>0{87s?X at 5@?qb)$2vYi?{5x
z>#A;sjsL&*!ULZJuPprkV=e#x8F>1?1;X=--Tx!N?eOoS|NkfO0r2<W$v}Mni|zk|
zz}w*6p9ii2SAtW(kKxsS1bzs<39bcO!4~ik at GkO}{C`0?#OMDv_<jqh0`VF6YxwUM
zgBO861>3>Bz!%}YMW25J41s%sJK($j3w#HB8OT}wCxA1+eZgDcy=Oo-xEr_~zWa^f
zSzrv at AAA~~`x5Xl at Lu@p7lL`P3p@<m24DRKuml1<`xL*=2Eubc415Q^`~BemfH#9z
zfxiN;1TO?H1`R%}SmJXx97++JNM{c^z7d|v|DI>8`S!?-xQ%ZAm6<}uNt2-5_G_-}
zbx!mZF;+BtDPL~tT$MXBFpBfxY|*v(nwtCxncJ|?TCmt3`kx)TvB&&ldZf7<x<AZN
z$biKYj90CzEqm%}B3%&4LHc7yglxA=rrAE~GULh^j5)GRC%@jq$R=iE4Y%FdtR<nT
z)jGHAt=0Pd9bq*>#f85hMjNf-$2l1CeZ5FV61CvO<6dzH;GKz?l6t)2k4&mf(=N#t
zVeO=oX*OxDbqRwgJSRG1taYlpXcx1E at 9MC9Rj+(8oGAsT4{JX_#N%EG!zB$-y?Z)l
z3rpPREA^}ijX1fXH0psovat|Xd|prI&h9R8!CJEpENsTz9Sa4$dNqi>J&f$c?(W>V
z-HmJ)g)ohk;w&W)B6b=>fy5iiR at 2wpNmO?`TByFAoo=c&QfJsj*n#8nnaJjcQ|Ty-
znI<r@?Azu~9h%%XAXh5rRp1ibn#GcGD2Zw?c#Tj7-a6Gzc=@k&3U#wzwpq!coqaCS
zmggS$yHp(LSTV`&RQ67?4-`2e^j+%{ZlWX}QowRe#VB4gzuWOWR^ahlWRKbY^^Vci
zwp~fwtwFjLjpya~%$ySNHk+B7N`ABF=5RZGT(dLF+j{2bW1FFyg+8`9x~n6cndw>1
zq at 13TRknB+OqHqjbLYEl9p(T*U>@_kJ4>FpNstbgp|)@*rWDDz7%XdIk|l|ObzI4v
zX_`7V(Z!ayR3X~_kmkWghkWAxsToj?-X%2?q~<}prMBBawG-zWdX<>T8Y2k=n*_8%
z=Gwf35l1XixDK{^T(H+3TR8VkOdc5EG(u1J{+{l^p6&sR-wxrVh2ck5;eI|4FUc-F
zt6b4-AmKzAD+1GsOB26|T7$zrIExwQYAjvSt!|?osfkVrnOd8yB5CMIh#4zRlGQc`
zW1=9+k7u&pPD9$2l;-Hi#1_hie1 at 5QHyK%jP%-{7nm1dU_^Ugys5P0CvzIhWwBuUP
zV#>p8_NOrek*sp#g-q at L;hRr|pBDbV*D|Fy!|#jkU;F^x09L^vumkjiM}eQf at 81T#
z0Nw}w3dntcF9cVEt3VYjfeJVid=+`X3xLQ7<a|IkcqI5Ra)6hD3OE-GgHymSkq3xh
z067!zJ at 7v8T;PK?@N?t?9|kW4mjdw>_;BzY>ho>zY#?>JnL0j(@2~LvS3vamPXawa
z^!WD$-$Fj{3Gi|74?uMKdC&(Q3BG~6;3MF*U<DimT|ndrzd>&BK2QfWFaZt#ktzHM
zxE~1Y{4YnYAouh=6x at M4;lto1pa?|9umi|le9s3}&<p+>dBLZ^Esf;{(sG8&H}hAD
zc~?%|NV#h@;T%&Ne)U>o8GZ>J%z3)~#s{&m`nn0X(QzV-sDjH~<YqG%tZGq at _i<JL
z)300!XJ9q<zm*Egl=D<K>337akbelLP1pzcfsk8BEqSsiTV^5SUFMp6S1*!l at dUJi
zS~+9RgQmQpq}GnqAoNlZGr8>19*yZBu(GJ at 4ZQADSJq0gfedJ^Xd!=O_|A0)U&llk
zk;bkIfh`7|t=T6mlIh<uZcJqNesM83Uub4gm6pDSwwxlW*eyqFjbVV{qNf->6v_-x
zT^{6KUOg7$n4Rbgu`?kJoPb-qk{BUk!_XcDHe2}WiaOq7xOAzc;(`k<ki#<^p(%@>
zGz{O#(JR)^GAA>P4lkGw=&c2O_>~S5UAg~h%r4F!7(3U$@W8-16O%IdML1+;4+%XR
z2<$XNUfauQRoZB*M7RcF|3Quxa%K`6jtk8U6i+2P&kNR at XT!`caHqRtW^$yKJsmnG
zsh#;&fk06B-VSt}GVe(Xb}SalMojA4>vxEx>L5d}c;IT?KT<5L_#FF|lb7t?RNxd#
zK9E9XzI2343r0)<@l8(M9Y%Jv$6GOPf){Z%)O4soJm}8rfzUTYRuu0qK|qxb>$zt!
z3$muYL9Wp<qrrmL(r9KNoWPZ;F&9R*B5Ydk`k_47 at ul`V$kJ`BRtb&8x|g5d%hf8I
zu}UvimJbd_vFz{c4DW0L88~*m5}$_73)Lp+LKJ$DabFWJCP401zYwy1NIt^PW+<!z
zEmW{!(lyW%=Zu`j+w2Wa%OSj}k;(H$hW+tF2e3e7){~i}Ra{h#o_FEk<mmAJk${Cx
zc<2<nK!Tk;Fm?XO*jR%=_?OgF!`*>fDG>%+aYFb$wQF{l_t+t?U`cPVg=%ZT>;wAX
z&XS8d5JJpz=Y|r?7QtI7q7pEd@&pH8<>;C at s#(Z!P!)rvVhK%^9%<{4)SQ)nu6T5L
ziM3yL0o}tU>DlFi{F at U$P20E1pKVX5d4a)Tu~u6yw4m_V&!&Os>>z@&NWnV1(K$&^
zZ#d~1_RIvY+a^=ioL3SDCAQ**Uyl@;kqMFAHkkus_M&XPuQ(Kt#QKu)F_IUHt&C38
zGu$Mq>4uG>c3UmzPAJznOq1lhw3j!E8g%bw$#+ru#+j3X5!*<h8vP-^VAQ&@(+Ld;
zk|VWYhZFvPAB^Mog|CGF&kGmHNBsZ27rYa^5G;aeuoFBMd>3B+M(`?70(-&z!R_$!
zZvn#J%iVy3;L+fh at baGo9|O+>XMw%oQQ#3k?hd#Q5TAdSf(kerJO+Fje*R5B&in5H
zf&Knget!#|{u|(J;5r~S`@e#h{|xvL_#k)zxE?Hl17Hu>0s6sd;1+oMzXLA=H-P7W
zXMrn$*zunReh82Mci>IniC_YZgF*01c>AA&TfsZQJAm;2<Debf9oz`7FaG~80FMTb
z0{;Y`KLH*Hz73E6R`BOQ{QW->JQzs3e6KmrZyIb}f0+%8xiAOTON%~g%RL^a(aMDq
zTU~u1)4xooR&=HFC%YzJt_xzu-Yzp}qj%fPW?QVBm<NiS{`R(da=Mmz$;&Ns?p+KU
zkOZ!B4N`d)-a%$MnQ=B-BP}tz6_3ibd~b)bQq_A at LsL-QO*aU{QEsO;CN>q^YRzDy
zSUnxF^9X)$$C}-&Hx8(mY;v}YlkMarLXJ)NB)}Yt8^L85>f{|o at 9qff$&4vOlutli
z5ey3BAh!Lsj+ti{tU<U*#spNw{WfVWJ9D0pG|vz#aC>VVNk?_r)=`xkmgEqJt~WvT
z^{Ff$WxMzkj?fGVLUeV^ae`C4H5gjQlMqYW(UFmnE!(&CdevndYNevfg?aF$SV+!S
zbBkD0;p;ioTAdxHCySmR<|?8#k2#kSQW#}^pEjK`+$J*<gfx@)UWTJ1b{0eE5|drY
z1Cd@?nn^+onm+NvoiZr*>nM at 3TC3Ud702A%W)r)gGc13gMQD<{w at FHyJp3}VTr4%Y
z4+D?ufkMPk+1q5kLy3H(WDY~B2!;OLDrQ4EX_$LNxn7h9yx=Z};AT-8&6+GD at KApe
zA%Rt=Vrp$?o+vPs&d_?0v^l_mnq%nPq<+JR5W9<+wA`7^B$A|)NNY6v>@9ZW2PLRP
zxJzuT%uvz^U!Aovvd at A;J<i-5xED8e-oah*9-n|r`Kq~~-57#9^{!a;P(-Mq$${yi
zv;DydsHL}i#jK=TA73fW%4r{cCDS~mHIe{%5x0I{)NW4$SA6$a5doD~Kw)GP<BMfS
ztSolN61K(9xDNp#jB|?uF|7^_mO^hN+k`vOU<F%ypHCf_!4I;s4c3+ljA%<yuePA}
z>)jWa`|t`iuGM7Ut9Bis*9ot*d~`8aJ*<AlS<mLpR1&tgDN(A#$Q5k;9AjH4v)eoz
zCR4IzG-M*^arR)-Gm?GSl+01UC8!+^cIGv+m3KLvl%|y4rHAEWW^<N|4b`Lr=W8#q
zHJ2#_5o6i-`j0;}BkZF1!*X=6P$*?zS|^DV$lCp7#nQ<-x~blYZc9P*tav<@uy!3z
z6o;-Y?JPN$so3QN%=m<zCQ$~bDKe%Hm-yja>pqNlPq%aF-SbY$cBTs0+Grx*5M}Fi
z8OCt-cT1GLy`#2}<5Cnq$K)Gu#zSWhjQdj~V<SV;{=nG5vj?PG8i{Ziex^bA!LdUl
z8No%Co0a_j$&r!qjPNiCnc*i#lr1)e`Tx5dJ|Oz<gBV`;f7s}j_genHVEM?m!{c8K
zE&-zV7oGp<;3OdD{BHrG^Zy6%a`1HU6d>mT4uO-wN#HB+{%-^?1YO`EK+Xi*A-q0#
z8aNgF1U~=A;Qs~x32p!{21mdY7z6|0bns&e{6--60Eizz(fdCP{0!dzr{Fz6&I=U5
zci`{E at 1LC4m;3(Yp1(JPBVY*}00ZDGuorZLuffxcU%y+yD}eC$dx7}>-vz{<-;aUt
z`=ayzD{wh at 3g`t70(ZdQ|0{SEkURe_1tlQo3X0%ja5A_%_%8hat>Eq8ZQv~MaPar=
z|6Smlw2idSdt!0`Sw<{_Y4lXwg5#IPxVOYcWfne_n|~RO*sod%X})wgIO2reu<s9{
z)*Bb=q%oY~4x^@=I=9V;Wn<5WCMG6_r~G{bV^bp{mUS}i#!PxHw_L)GTCO{Gn64}a
z$1F72$Me at Z^L(QCU2_217MG2Dc&NI~bD7`BNWl~=WJc6d!8|kO3YHoW+G>|#%sMM@
zTNWvr at p^HofgxI(r-q{FgLTIXdxst?nUj4W?Hz6?R;sxr<+rsLAh^)m=ly_PS1vk~
z8ZL?37+hXs)e)qg+#>4s#@Rer9d($W)5pTyVzi?OPmEfwMzrJ8BNu27J0Sj_&z~GP
zC?!Sop#4gOobqWD{=n$uq}57Wk?XnP-2mnt9UHHGBLmZGB{eiQaKPl9N=aY&(-Zy(
zs)co>10yv#JYv-4*~zVyOh}1Tbf-G0cjFV|rhrB=+$wClRTLPhODHAw>eXDiR+0e_
z_L1lgsYEp0#>cx(n_&P96Np7merfeYbaX7-bM+jonE2w9mRFO(P-rOvOXN%Xzd3V|
z?Rh}hWKMB95^?R@%S-A?%np=VgU)TTlwOOhL`xHP?{Y?`cDZ(I6~0^+w-c5Xh@^bB
zN`_`qx$IB2U7wAd9YvmIM_WtL*^ooJ<l=Qkb-1H-$8k&|jiffYHrPbX<BKl2cyn>n
z;VpXuscuj*m#tZsLz_)u7iV79)S~66d6uk<0XG?|a41&{CAVp2^Aa^iv(9ucAt7YP
zmt;HBy~N1S(K^T6?o#*qg37`pm%GR=#u0?-P3@(UiYip3sh1$u)Nes$xr(n!PWuGP
zLiJ29f{GSh;bhP%6~bZ1)<HX(p$&^#{2a at 1h%QZ=*=0<|bevI+Mn~x1MhjpDNkaN{
zBHhH;p_(~R6YgT5^dX%&j68 at b0aa)fRjVOnI6GkZeTmdC5O?~atTgI8Jdz*@vIgWf
z^4s`=Y$q)Zvi6j<$xfhQp+s;H&RR$Z%)ITTK8<FpWI!jJY19r!IL&A>4}-~B1sZc)
zhv19U*|=1ZL!I(pcY|Y{=^Wx)9g{;a2gJ*loCK{y9@)ROgof?S4^|Q`{h`?qXf~LG
z(*-_Wl5{p8iIzTHs$^~5TM&-5#?m52_qMHL9=*<zy{)$9<6eROYx=Tyj#u5@=&&kL
ztfp^tSXFr=<MtvaYY<`vv72(Jc8t`Ga1?<q(*BT(HC2u)H4b0)^=>+M&}<4qdlTn%
zPj~FKN^NZ1-S}&ew}DYfm}FO9vpD)T6{o*h6nUA75tUoEB~h8=xe4r2$kI2u^(7#@
z_1R}A;KpdyS~ik*R at i>QI>N16s8faiAAslomGGA6{}(L(|1<b}vH$-B_-i1301kpv
zf!qV|@8Dm-o53pB4^9F11a}8_17ZhoE!YBn3Xgv?_*?LLPzQnE|A+DWp+Ic>zYM+v
z{svqO9tLiPxBm<9L~w8L5%~HKgO`I6I30Wo-u_LX3eEweU_aOgc7ksRUk`2tZvvv*
z7k+;?*afzNZ^PSv6MPbgjsMl)Y2c}#20B1H5TE|vfX9D35WfM}f at gxuz!QP!{7(j-
zfwzARr~%>s&jn|I- at x17288E-7q}EGf&E|~5Z?cL at ckbLH-R^TRnQK^CP3QimoZs@
zZM0+kGI9aDNn*sy&Kg-kpY%t&K!+WL;bV^mHFBYe*-m<LGEZ1LO$Rn6K&o9fnvzC|
z$(<?2URVr|M<#K$EZ0Ca^CsLS&RPgjl~dPT)?5?&W#iYSwoshY8+}v`qW{S|`-81m
z8)G9N!A?{^1lI+cl}ioy!zgB$L8vq3E at DG7aT8;*wnPhFK+Jxzm2m!txLQbAkU7p2
zCb!4K2P0=FR*=qIc2VcWus805uH=Jm-A#t;d#uh^aadeRf2Elv=1Y~CFy-!xF@|tc
z?!K6i=t$f^<Q5OqW!ZpOC<+-5)v2Kj;}n)GiZWYVyr{=qwQ{-UDfv2|7?bA~vFGAo
zHg!TLn8GL<$k&t2wZt-rBCwNa6eFxfFbp#H8(}Eh&T+3fVn|=8W^<Wob&K6apmUoG
ze0Rmn5!idnJ89V%-y`NHoB-g)sjT2SauP9IwQMq14ew}~!{Q`Q^ob^1Uj|n_WY<$R
z!)U)KqPIzchg;D|Dzpx!+0|+}rV3j4c00jn$!&EYd$?susqjVWhhq~t*x9(unozWX
zS0ky6vNMG`heZ>zGg~|>BMYPs)|r787e0?7$Wakx3eC^mfryp)fLmAO_2$ja#2oI1
zFY}n1!xJWmuf|3u<%EeA%0x_7UU=8_%Jwz|B}N=$=By~^6e-9w{jseP at pxLebU2r1
zNC`H@&p;zq!4S-q2c at DLFS6-8owAwi6Xsgxp||dnomLv#P{5oyf24#qCyHN5)K at ym
z!0<4p(^LK=7ncl=j_>zJ#s>yDkTZ$of4^BT60ws1HcRC^NyWROMdR3hV)PP${L$Eo
zU154`qrw~tlhM7hA*!U)*}+*X-`Y0gyvlU at gSds2dw<7A2B_O~=3;RywSX3*s at F_L
zO8vhEEk?&r2rX<fX<Bg9XiZwQ#B?=y!y!_sB03 at 6BRGx3JB$><ckzgw#&<;t(>}Si
zlDNtDaV1d9KyYHIP~Jbbb at +m=PPIrkTR$i3&JME0w69>S+C^U_RyihK7$u%#Pe(Np
zT2rJ at fGxe)NxP?`-Z&iFEPEEt4a6g9*_2X3{jICLkesK(tt1Bec*kKSE{bWa-fO8Q
zhhAk_uIoYOMx)7fNP)S0U?Ok-Zx_3Kxwl46<t2+<Yh3KGuGBkAgzqR|LM2}?*hIsJ
z?ncZh0}T)pGMO7beFg#JVKWgpM2ro*<hT=G%mYTv;S!!W#igKw+Bl=(SVc#Xl}ps6
z8|M-#JnXnP`5Rq|Q~X#JA(Za at V_l<Zt?X=)S;!MuEhn2~z3eNgSYYFy)v%TdMss_)
zv}CN3JseNW)CueOS0Re<|FFI-Pk^r!{{QKghkOfszWDz;AIO>i`-1Po(|-`W1{?ts
zK=k|K&;Lg7O0WO|d;gycPY=Eh#E1Voz)L_L%z&NX3?S$GKMy_!-VOd7<bd%1PX_0K
zec&vx1w0l!5ZoW!58NC48*+ia2Co3ugFMKAJ|I5+9|Rr<P6Gdoyg=j!F9S~pPXl5r
za29w7_&)LiIXCcn at LcdLa2+@b{uEpcM6U2K at P8rRhk@J`_*(E>Am<034Xy$cKx_<l
z0P#QgQ)CA>f%kxS0l7O+<O>zh5Bk94z<(k?crNG$pG9WyKJZTPI&dv`IuKieNpKKM
zfK$Q!!KaZQ+ycaR;Wc0u%zzx|0Z#y*qrGnhH-hH^Id?D%`avs@{%|G;KB9uHq3HK8
zvFz9GWB(5ihpB>1RTTA_Trn>G;jqHh9Ul|AoF9_u5VvVMJ8~8PlX-bEBgU6jl<qJ#
z>#=M!if*|&HYlF1PjUIVn55U$*_)`h5u-P{M%7wo8tt|ux=HlTe!Ujo>{6NY3*HJ2
zV`Ks0 at R!ztboB~Vaq=tv*EsL2YetLAtyYa;Nv1B{TxWYxt)UyV%gtKiwR_<;v$}n2
z_s%qFC{=~|T%+zzdvK}IDho!j<Z_8IB8Sxs5|(pcK`hRM+2UL4*nA0-e{TVai`Q%1
z;fXfn%9hi)`HiJd7IEJ%_VoApzGqhbI2F|K;4XrfYK65(bb4`)Jw})w!O6>$k9e&Y
zSA3$Uh2!xgLp}8d55!NewpyzfxGiOr6E6j>bJn)90x2QRr8wi7 at 9?HL6)%z>o1Ua}
zl#=)Lw(HTlN|`e&)xu(~ST@;OQmiZ#>BRH+xt^<579F-cXh##hr+Z7!Hd9VH3R9}o
z>buAn7w|d=%mC1&A=+q=wJkgL*bEXm^3c<*Ri$%DC&PFJ$JXXFilnMn+|5eKCA_vv
zK%B}PrT*=7GO<iKwhlIW-k{R>?5XpkK6c>H)U<7puqiA(bf%C&g<xT>S}3&Y__mB?
zRLO+(xduXsS`%S}2F4CO{!m+XtptoHBawi8h;^?k3^4P~EWQBh1uJJTkC;UDM>yUh
zQHUKPwqRnPv|N*Ih}odo$0j?rHNj~Qw{f%U?G)SdVyTmiy+jhDD7mGgZjS)RD6x{$
z%VH2kRM|WRgmY3A4kcDRdq^Oh`(l|&m7u?*YK|L4o6trS2#fvOslDetK1P6<<=SeZ
zf<{yC at rl(<Dilz(x?C<pujrI=j70JnLNp~&!=!`8N{Zz)g1@}PgeV?)qyuGkK4a1&
zEf97?I<HX<Co)Y|M_SK{yAvU!n&WVPxgZBVvc`n#ciWUVdq|i`UdEI--erc9+Q_0C
z(6_cc!!1Vj!mLjD)69FzO9&Y`bG*vmTuEm5RdZV>2RL-IVP;$vNTRJ at Mu~4|#ad at 7
z&um`t3P+2o1<=wtBP}`S=mj*gOLx2Nt`>=|XN1kTjrF8RTx*Hv%t>KaGSA4^N~sc8
z2iWnG{nC!SMAL*cGc6-2B&Lm2!I}<l;@cd;0cne)e#rxu>&jkEPhN;Y`q;z}=BED0
z<fNS{+Pxut8t<RRtkO)Rngg3VGhc at 7kkzNkg%z8Q7DFQG54U&Y)X%19+j@<g1{-Op
zPPn at 3z{v3EfX`{Q=@Eb5*rBPjy({b`rGq2;N5}m^Ih+;PlPP_<#*x8ABOGTHL{Zd0
zX~!M}(S-Hhg_InRm+H(oSM$1%#Tx%XGnG2$dD+0AYU2fmdc7_ku8n9Gsi}1FY!ocg
z&4|vZ`{Jg7jkkdHCDnD}lImPfQjKq)ZS9n6rF&33Uct$IYt^+y^oX)&o*F$c-0$(q
zyphvGX0sdGJT$7W(RVgWx2rFeuJHe`m at SVKUJw5ND$DTQ0l)t>@Kta-_yBktm;t+i
z_yLgf0H=XJ0$)ZJAZG!t1D68v`PTuygFN7GKn^_F$_DPi_sQT3 at cy3zp9MF89Poko
z{(BtwWAJHs`#KOAfbjof|Nr0c at Zt+#6)XYa^Pd8`z(c`*z{7tC90kJH7r+SE4897_
zF1`W&9ozyw0<Hzm0G9yq3Ah`a0pvb`- at vmAkN*Sk8E_+bKX at N_3pfmlU>t}&fd}pd
z?tq8?I`}M*a|G`L!t=iyh#!H&pa?DmXM&T#4`_&g1g``y24Yk2XW$yJ0!{^w0Y8Pu
z{}d2ez?DG!30?*k!4rVk82l0*U*rI91kVM}0nY|c1?Pcja4NW+c7Gkn0qFyBe}R4+
zD>l*evG(RwsUF(4g-`wb3|8(i9x<n>CWb6CVGPwhv05;XhbMyl;9*88!K+vzwbgPy
zmVi9Sh%Ap|5zR(C7S%k;h-_ZOqO-ol;_`n+M4m=l9-)v~jKt}|3<T7z7`AUmiWtNd
zXWLp>69>k;)c)VDr1ln_VtGz)0<?1 at T5eSN;npCUG4+KMItqw7KRaNT8WBVR(dcIf
z>?B}(y%l#iPRTM?-B4qQOvRWNV9 at QVyf@j+mPn1Z>`l}`iW0=4u3DvxfTnU`KwG7Z
zfTnU`K&euAG}NgH**gCvt1YeRylzl!Y06D*GHX)85F*@Bn>Eci(W8{fa%NoW)!@8!
zybnn{T}vJJeB2O$XgpwJlHt=AL9H_*_c|!ef|c&_L?6OXxgd9JTY at qvG@xf_U=jKL
zjYdmsUu|sewU*G$@+T>3&dAjj$*LOX4h<=j8HZX*FA}~ts$_geEmt{_Tc%B~91w77
zuZJ{_hXj`IaBc^cQpE at p-GHeZ#@~6`#3^%ZM6uI~rHaa_Q_D|NcNB6}sL}j~N4^68
z6A7|9{VhB#<}^bX-HbXKC1er<Uk)eAntjbVB31H;)k_ZrEwAa=884}aba{Knsw?TM
zV0Rb4YSl8L$JOB))XAC(sW<U}ABx}EdJq9seNMEnaxlX1rlALr at Qz4njnM4qPEq5y
zW{q_1%xt^v>KVJ2J6XG6qRwt?d23rcoZ!T*vq(|g>_znA&NoeFJ!c7B&y4RJGmN|+
zs7+=tLS=PGx`yYGSyH1y&2wdy%0*>rnXlIaL0%|%p$eOrGf?#~UmMxJOruuH&vw=R
zQq9di`)R|1096<?!Mad9VT)v{oGat)ng_ErNz`g767qUA7+_P!S>2fucg4VNt0by+
zxVWVBHK$9ATE%KJ2r~!SQ?CQHMupo<y}8_BamiQqIQmN_l;?1vph;2~KB99F!C_9M
zxbj*WGhH}UW{ge{v|O)NO3)!EuAjt$2 at Z82pC@^nz~Gd6PRUNkYKkaWPoJtk+C^d!
zQgx|bbuRV^luqoP>SDZSrAwxb!m~l~)y+0+qh<|f9 at Agh?R1JwZup<M;xR7Dw30V0
zjAY$rGNi;o(W0WWvRuv`boaU!L}mD(3e-fiREN9_FOx9RC)q$3ju!H3>LE?kxDc$}
z-9;m`3>B*=91&X<^2=OhD@~fzJ__a1om}|;AsD{x*8acGvVZS at r<Zg8!rQ+HK7PpZ
z at -KsLKLAbw{|0~lY_J1-7rtC<_Rj}Df(L&!=m2kp=axJBP6BU$pBDdn;%8rU<8mk8
z$KiWLAO1#A1)}@D10MHzU>~>_5Z(7OkaP0|FbhV&kKkWF07S3-2=GOCSJ7qf2M+-E
z0djU;?%S&Xsbe2F0UvF4Y4@;cWo{emq2Hz-hMHGt0yEj-oM>?1!s*F@(J_CzHDU;Z
z&3Js%V*F{QxMt&>Jk5P8-yFFvms~}7qziY<Noq1*BdtzUz}$Y4u9$hQ&e3hX64VH9
zJSwR3{zS46h5dhE8z^eSbSjSaI+4Hg#*~0r7zLu(AR)S}dBr0$hSpA*mQcI;xqQ8d
z)4_N%Id6=!_jFNY%mxm(?EDdH>C}5Sp|CY2l)Y%FUKL}yNDdNzWkd at u$rA5{VCw!)
zXP<TTLMKXCps1_F3KKofka0LK!z5)-=s4VpcPv`M^enS2PZL+hj at um)&69jBr0q|q
z;`E6`0?wO1*xr&sux3+M*s at 9a-JP3@vb*fsQ;e40cCx|AiGgAD-<;}ZVZWBq;s|SE
zojdU^d#E{)rKg1n3(cH&v4j)v(g`O5#1c+RMC8bXJ40lKNN17`7RyK3)}RW8fr#aj
z at jjhLGLX*Wv25Z at e6lL3x9Ke6L1Jk;WXz~Q>TNphc#v4ydNhW~2;(%d6iJW<PBD6y
zPB#%bmT)X;EZNwbbfU4>u_UA2WXiBDmO+zn>Fk;WZjgC=E88IFc%Ww4#zSW0nIXtG
zg?7dH?$YVL%}6h1E0IzB*!xB$j|IxeL`@zt5;vE9>mDv$WPO>DSW*{ZDi~@c(g~?r
zA~A~v&Mw_4Mg~T(%SrDmowu<<>4v~sjK`|zzA%J~?U~%yu>{SzxmZ%>QAQ%>MJ#%n
z)((|pB}fz4jC at QOW4VV<GYSyCi<QAVMQeswz@@PBykS}zD<d at +XSDI@)bx47)bwpE
zwS*U(Sc-{v8L1{h#8MUuo#1F)ELrzOMw;&HSb{3(!!WH(2)Urq93+e-of#w}kIZnf
z%wmo<VtK^gWTYK?A4^l08adG!oRW;Cn|hm(b}CFfeW5r$yTp*r;U<)z`Zz1aFpfF@
zFaGK83*RmJf8-tdk^BE%1+D~VgZqF_AOpAoh+cmS_#b2dH-lG$IuN<Q1HhM%2fPYA
z16%{H21kJS`Tr;612=-#0`c$vMPvlx+y4r10XQA}G5BZX1=oTx at O5Mc&jWH-pWM^;
zRpbV52hRgjK>YK6hw^_4d;*9};e+6M at H{XBwt*)A(X~GcJOVr%XuWNnH at -F~ut9+h
z3jCo`Ko*T+UN%TZff8v^RhDM|wP)!(K27d%3hvPfR7g#N26y5hnh&i6Qa8fEfa7G)
z=gPW59zBg*ASHi7o0725Qm*)iO at q~G#-GP;0`3p5wlZrcKB{W9t_JRyeycYD%XVJu
zpRMci^_?T192v*|<gtde`p4$}u{dH_>y#te{r-*)dzv*8-}wt at 3%QO9st2y|`g(B-
zmZ*jLbM5Kosx7bcsCyQwY1$>Rr&v4bWSUKyYft2_EU1cv78hmqfBXkfcyZC-x*14y
z7wuxU at EoT$ebvt+=2a_v?mLTwNO4(is~a`A@=@wp^Ee~bje(BTr)O?X?L+klP*3O1
z?k+iHhBq43G1`osJ0VT%?O|jmc6aB_?QZ12b&YA&z-zVYI(yu*1#c)@P0O^ML{%lI
zh3ebc>85In6kYykZqg&N`61ibR2VZ&gf7JQ4GfLg>#ihtcyVxNXkB6a%%xjH%Pn%^
z<gk{jggb at 0*)O4&=`FVPje>HGrdNBic=z!(NiyVPZ73oa7@;bYe&xIjd{Ef?^|TY3
zXHxUf3`!K#q6|0pdS1?}H9t{Y;-R4|*NXFHjzi=ZIKStpEmgB_+NP~VhHG%+3mizK
z?CEb{kP~U!F?!m>=y$aDiLoD7VYV3EK)M=@=k55+ox0Jp+05->&7NE0bOIGeh3(fx
z18=p^Ube4~&{)H9S{iF?(@YIxr)r<Bsys>h@@qDOHw%4ib9nqlSZC5sPuZ#pZ$iD}
zok~;f=gv9Dd{=<3O#d6RXgCF%yLV-r{%%c at X*xq_(f>am{<#icE&PAC-TeLreqZhY
zd<~cdd%@$tPvQH248;Hco4^ae^<V`&3ABP=AOjG;0B-=#0+)c@;Gy6r$N)YHJ_5w|
zzt|4+gNJ|zg9m|=z`r9K5PJgg|Nkf8LEtvz0&fM^fs26H7s%xWzeYyzDzFVa9DISg
zycB4i{!lmb8};6xzy<|2D6m0+4GR2 at QNWnM84e>Q=uxSTF at rO=MMVsxWe$aV4))*j
z$k>6)d3Km|yk&@3$S{}2Z=9Is%C)n8saTdH at zo+1W{aN~v1Yc%T=NSR%yzx=xC&?g
zxZmC4 at R}~G3GZl*CyRMZSO_aH63&uz?KLo#j|<<egRxAd*mhSlmTU2kw2^X!b-n#;
zE$@0k=q0(7I$QJ<u|7fI*}_tN-GSE~aAmFR8^{yaiWc(HhEHC1aO9R^fo|>A>0Zq~
zhJ)h{NR71aJWT(Oaqg;Nk1RpAW%KSai(+NRtwcyu<em!SYw-eq>d>S}WW>cNRWJis
zMHu2tRg|;%F2Z}S+SnyVrLBvtlO;rKnBqN2F0?b|k=2#pl3?QwP at L|~R@|%X$&ria
z&obgKBSHw~3wkS;+TeSa(WsZ#O^=R^h%agX!UF^6*z1CjJ(=l2LgNzEj8|f)eA_wI
zVfwxtl`~GMB{BcPz);ssB|Fax)|;o8w`FE_fjb=@Gea!3?CH=kN$t!xZmXjivKKFL
za=@1h4!Db2oJ8W`Key_0L~jw#SwzxvRHml!z}ypcq{u<o!qK`3siWD*rbN1D at -`2-
zsaJ-2{G}tXv~TEGCSD+I#JyuYPF!SRI#wWRj%pPx8yRxPcz+2N6H{%uB1H~2L|y}J
TM~MXsUQ45yf$)2|lC}JQDEuA8

literal 0
HcmV?d00001

diff --git a/src/intel/intel_defines.h b/src/intel/intel_defines.h
index 02ffde4..b424233 100644
--- a/src/intel/intel_defines.h
+++ b/src/intel/intel_defines.h
@@ -87,6 +87,7 @@
 
 #define PIPELINE_SELECT_3D              0
 #define PIPELINE_SELECT_MEDIA           1
+#define PIPELINE_SELECT_GPGPU           2
 
 #define UF0_CS_REALLOC                  (1 << 13)
 #define UF0_VFE_REALLOC                 (1 << 12)
diff --git a/src/intel/intel_gpgpu.c b/src/intel/intel_gpgpu.c
index eedfe31..6d3c443 100644
--- a/src/intel/intel_gpgpu.c
+++ b/src/intel/intel_gpgpu.c
@@ -58,16 +58,9 @@
 /* Stores both binding tables and surface states */
 typedef struct surface_heap {
   uint32_t binding_table[256];
-  char surface[256][sizeof(gen6_surface_state_t)];
+  char surface[256*sizeof(gen_surface_state_t)];
 } surface_heap_t;
 
-/* Stores both binding tables and surface states */
-typedef struct surface_heap_gen8 {
-  uint32_t binding_table[256];
-  char surface[256][sizeof(gen8_surface_state_t)];
-} surface_heap_gen8_t;
-
-
 typedef struct intel_event {
   drm_intel_bo *buffer;
   drm_intel_bo *ts_buf;
@@ -142,6 +135,14 @@ intel_gpgpu_post_action_t *intel_gpgpu_post_action = NULL;
 typedef uint64_t (intel_gpgpu_read_ts_reg_t)(drm_intel_bufmgr *bufmgr);
 intel_gpgpu_read_ts_reg_t *intel_gpgpu_read_ts_reg = NULL;
 
+
+typedef void (intel_gpgpu_set_base_address_t)(intel_gpgpu_t *gpgpu);
+intel_gpgpu_set_base_address_t *intel_gpgpu_set_base_address = NULL;
+
+typedef void (intel_gpgpu_setup_bti_t)(intel_gpgpu_t *gpgpu, drm_intel_bo *buf, uint32_t internal_offset,
+                                       uint32_t size, unsigned char index, uint32_t format);
+intel_gpgpu_setup_bti_t *intel_gpgpu_setup_bti = NULL;
+
 static void
 intel_gpgpu_sync(void *buf)
 {
@@ -234,7 +235,7 @@ intel_gpgpu_get_cache_ctrl_gen8()
 }
 
 static void
-intel_gpgpu_set_base_address(intel_gpgpu_t *gpgpu)
+intel_gpgpu_set_base_address_gen7(intel_gpgpu_t *gpgpu)
 {
   const uint32_t def_cc = cl_gpgpu_get_cache_ctrl(); /* default Cache Control value */
   BEGIN_BATCH(gpgpu->batch, 10);
@@ -272,6 +273,58 @@ intel_gpgpu_set_base_address(intel_gpgpu_t *gpgpu)
   ADVANCE_BATCH(gpgpu->batch);
 }
 
+static void
+intel_gpgpu_set_base_address_gen8(intel_gpgpu_t *gpgpu)
+{
+    const uint32_t def_cc = cl_gpgpu_get_cache_ctrl(); /* default Cache Control value */
+    BEGIN_BATCH(gpgpu->batch, 16);
+    OUT_BATCH(gpgpu->batch, CMD_STATE_BASE_ADDRESS | 14);
+    /* 0, Gen State Mem Obj CC, Stateless Mem Obj CC, Stateless Access Write Back */
+    OUT_BATCH(gpgpu->batch, 0 | (def_cc << 4) | (0 << 1)| BASE_ADDRESS_MODIFY);    /* General State Base Addr   */
+    OUT_BATCH(gpgpu->batch, 0);
+    OUT_BATCH(gpgpu->batch, 0 | (def_cc << 16));
+    /* 0, State Mem Obj CC */
+    /* We use a state base address for the surface heap since IVB clamp the
+     * binding table pointer at 11 bits. So, we cannot use pointers directly while
+     * using the surface heap
+     */
+    assert(gpgpu->aux_offset.surface_heap_offset % 4096 == 0);
+    OUT_RELOC(gpgpu->batch, gpgpu->aux_buf.bo,
+              I915_GEM_DOMAIN_SAMPLER,
+              I915_GEM_DOMAIN_SAMPLER,
+              gpgpu->aux_offset.surface_heap_offset + (0 | (def_cc << 4) | (0 << 1)| BASE_ADDRESS_MODIFY));
+    OUT_BATCH(gpgpu->batch, 0);
+    OUT_RELOC(gpgpu->batch, gpgpu->aux_buf.bo,
+              I915_GEM_DOMAIN_RENDER,
+              I915_GEM_DOMAIN_RENDER,
+              (0 | (def_cc << 4) | (0 << 1)| BASE_ADDRESS_MODIFY)); /* Dynamic State Base Addr */
+    OUT_BATCH(gpgpu->batch, 0);
+    OUT_BATCH(gpgpu->batch, 0 | (def_cc << 4) | BASE_ADDRESS_MODIFY); /* Indirect Obj Base Addr */
+    OUT_BATCH(gpgpu->batch, 0);
+    //OUT_BATCH(gpgpu->batch, 0 | (def_cc << 4) | BASE_ADDRESS_MODIFY); /* Instruction Base Addr  */
+    OUT_RELOC(gpgpu->batch, (drm_intel_bo *)gpgpu->ker->bo,
+              I915_GEM_DOMAIN_INSTRUCTION,
+              I915_GEM_DOMAIN_INSTRUCTION,
+              0 + (0 | (def_cc << 4) | (0 << 1)| BASE_ADDRESS_MODIFY));
+    OUT_BATCH(gpgpu->batch, 0);
+    /* If we output an AUB file, we limit the total size to 64MB */
+#if USE_FULSIM
+    OUT_BATCH(gpgpu->batch, 0x04000000 | BASE_ADDRESS_MODIFY); /* General State Access Upper Bound */
+    OUT_BATCH(gpgpu->batch, 0x04000000 | BASE_ADDRESS_MODIFY); /* Dynamic State Access Upper Bound */
+    OUT_BATCH(gpgpu->batch, 0x04000000 | BASE_ADDRESS_MODIFY); /* Indirect Obj Access Upper Bound */
+    OUT_BATCH(gpgpu->batch, 0x04000000 | BASE_ADDRESS_MODIFY); /* Instruction Access Upper Bound */
+#else
+    OUT_BATCH(gpgpu->batch, 0xfffff000 | BASE_ADDRESS_MODIFY);
+    /* According to mesa i965 driver code, we must set the dynamic state access upper bound
+     * to a valid bound value, otherwise, the border color pointer may be rejected and you
+     * may get incorrect border color. This is a known hardware bug. */
+    OUT_BATCH(gpgpu->batch, 0xfffff000 | BASE_ADDRESS_MODIFY);
+    OUT_BATCH(gpgpu->batch, 0xfffff000 | BASE_ADDRESS_MODIFY);
+    OUT_BATCH(gpgpu->batch, 0xfffff000 | BASE_ADDRESS_MODIFY);
+#endif /* USE_FULSIM */
+    ADVANCE_BATCH(gpgpu->batch);
+}
+
 uint32_t intel_gpgpu_get_scratch_index_gen7(uint32_t size) {
   return size / 1024 - 1;
 }
@@ -702,86 +755,28 @@ intel_gpgpu_set_buf_reloc_gen7(intel_gpgpu_t *gpgpu, int32_t index, dri_bo* obj_
 }
 
 static dri_bo*
-intel_gpgpu_alloc_constant_buffer_gen7(intel_gpgpu_t *gpgpu, uint32_t size, uint8_t bti)
+intel_gpgpu_alloc_constant_buffer(intel_gpgpu_t *gpgpu, uint32_t size, uint8_t bti)
 {
-  uint32_t s = size - 1;
-  assert(size != 0);
-
-  surface_heap_t *heap = gpgpu->aux_buf.bo->virtual + gpgpu->aux_offset.surface_heap_offset;
-  gen7_surface_state_t *ss2 = (gen7_surface_state_t *) heap->surface[bti];
-  memset(ss2, 0, sizeof(gen7_surface_state_t));
-  ss2->ss0.surface_type = I965_SURFACE_BUFFER;
-  ss2->ss0.surface_format = I965_SURFACEFORMAT_R32G32B32A32_UINT;
-  ss2->ss2.width  = s & 0x7f;            /* bits 6:0 of sz */
-  ss2->ss2.height = (s >> 7) & 0x3fff;   /* bits 20:7 of sz */
-  ss2->ss3.depth  = (s >> 21) & 0x3ff;   /* bits 30:21 of sz */
-  ss2->ss5.cache_control = cl_gpgpu_get_cache_ctrl();
-  heap->binding_table[bti] = offsetof(surface_heap_t, surface) + bti* sizeof(gen7_surface_state_t);
-
   if(gpgpu->constant_b.bo)
     dri_bo_unreference(gpgpu->constant_b.bo);
-  gpgpu->constant_b.bo = drm_intel_bo_alloc(gpgpu->drv->bufmgr, "CONSTANT_BUFFER", s, 64);
+  gpgpu->constant_b.bo = drm_intel_bo_alloc(gpgpu->drv->bufmgr, "CONSTANT_BUFFER", size, 64);
   if (gpgpu->constant_b.bo == NULL)
     return NULL;
-  ss2->ss1.base_addr = gpgpu->constant_b.bo->offset;
-  dri_bo_emit_reloc(gpgpu->aux_buf.bo,
-                      I915_GEM_DOMAIN_RENDER,
-                      I915_GEM_DOMAIN_RENDER,
-                      0,
-                      gpgpu->aux_offset.surface_heap_offset +
-                      heap->binding_table[bti] +
-                      offsetof(gen7_surface_state_t, ss1),
-                      gpgpu->constant_b.bo);
-  return gpgpu->constant_b.bo;
-}
-
-static dri_bo*
-intel_gpgpu_alloc_constant_buffer_gen75(intel_gpgpu_t *gpgpu, uint32_t size, uint8_t bti)
-{
-  uint32_t s = size - 1;
-  assert(size != 0);
-
-  surface_heap_t *heap = gpgpu->aux_buf.bo->virtual + gpgpu->aux_offset.surface_heap_offset;
-  gen7_surface_state_t *ss2 = (gen7_surface_state_t *) heap->surface[bti];
-  memset(ss2, 0, sizeof(gen7_surface_state_t));
-  ss2->ss0.surface_type = I965_SURFACE_BUFFER;
-  ss2->ss0.surface_format = I965_SURFACEFORMAT_R32G32B32A32_UINT;
-  ss2->ss2.width  = s & 0x7f;            /* bits 6:0 of sz */
-  ss2->ss2.height = (s >> 7) & 0x3fff;   /* bits 20:7 of sz */
-  ss2->ss3.depth  = (s >> 21) & 0x3ff;   /* bits 30:21 of sz */
-  ss2->ss5.cache_control = cl_gpgpu_get_cache_ctrl();
-  ss2->ss7.shader_r = I965_SURCHAN_SELECT_RED;
-  ss2->ss7.shader_g = I965_SURCHAN_SELECT_GREEN;
-  ss2->ss7.shader_b = I965_SURCHAN_SELECT_BLUE;
-  ss2->ss7.shader_a = I965_SURCHAN_SELECT_ALPHA;
-  heap->binding_table[bti] = offsetof(surface_heap_t, surface) + bti* sizeof(gen7_surface_state_t);
 
-  if(gpgpu->constant_b.bo)
-    dri_bo_unreference(gpgpu->constant_b.bo);
-  gpgpu->constant_b.bo = drm_intel_bo_alloc(gpgpu->drv->bufmgr, "CONSTANT_BUFFER", s, 64);
-  if (gpgpu->constant_b.bo == NULL)
-    return NULL;
-  ss2->ss1.base_addr = gpgpu->constant_b.bo->offset;
-  dri_bo_emit_reloc(gpgpu->aux_buf.bo,
-                      I915_GEM_DOMAIN_RENDER,
-                      I915_GEM_DOMAIN_RENDER,
-                      0,
-                      gpgpu->aux_offset.surface_heap_offset +
-                      heap->binding_table[bti] +
-                      offsetof(gen7_surface_state_t, ss1),
-                      gpgpu->constant_b.bo);
+  intel_gpgpu_setup_bti(gpgpu, gpgpu->constant_b.bo, 0, size, bti, I965_SURFACEFORMAT_R32G32B32A32_UINT);
   return gpgpu->constant_b.bo;
 }
 
 static void
-intel_gpgpu_setup_bti(intel_gpgpu_t *gpgpu, drm_intel_bo *buf, uint32_t internal_offset, uint32_t size, unsigned char index)
+intel_gpgpu_setup_bti_gen7(intel_gpgpu_t *gpgpu, drm_intel_bo *buf, uint32_t internal_offset,
+                                   uint32_t size, unsigned char index, uint32_t format)
 {
   uint32_t s = size - 1;
   surface_heap_t *heap = gpgpu->aux_buf.bo->virtual + gpgpu->aux_offset.surface_heap_offset;
-  gen7_surface_state_t *ss0 = (gen7_surface_state_t *) heap->surface[index];
+  gen7_surface_state_t *ss0 = (gen7_surface_state_t *) &heap->surface[index * sizeof(gen7_surface_state_t)];
   memset(ss0, 0, sizeof(gen7_surface_state_t));
   ss0->ss0.surface_type = I965_SURFACE_BUFFER;
-  ss0->ss0.surface_format = I965_SURFACEFORMAT_RAW;
+  ss0->ss0.surface_format = format;
   ss0->ss2.width  = s & 0x7f;   /* bits 6:0 of sz */
   ss0->ss2.height = (s >> 7) & 0x3fff; /* bits 20:7 of sz */
   ss0->ss3.depth  = (s >> 21) & 0x3ff; /* bits 30:21 of sz */
@@ -800,15 +795,15 @@ intel_gpgpu_setup_bti(intel_gpgpu_t *gpgpu, drm_intel_bo *buf, uint32_t internal
 }
 
 static void
-intel_gpgpu_setup_bti_gen8(intel_gpgpu_t *gpgpu, drm_intel_bo *buf,
-                           uint32_t internal_offset, uint32_t size, unsigned char index)
+intel_gpgpu_setup_bti_gen8(intel_gpgpu_t *gpgpu, drm_intel_bo *buf, uint32_t internal_offset,
+                                   uint32_t size, unsigned char index, uint32_t format)
 {
   uint32_t s = size - 1;
-  surface_heap_gen8_t *heap = gpgpu->aux_buf.bo->virtual + gpgpu->aux_offset.surface_heap_offset;
-  gen8_surface_state_t *ss0 = (gen8_surface_state_t *) heap->surface[index];
+  surface_heap_t *heap = gpgpu->aux_buf.bo->virtual + gpgpu->aux_offset.surface_heap_offset;
+  gen8_surface_state_t *ss0 = (gen8_surface_state_t *) &heap->surface[index * sizeof(gen8_surface_state_t)];
   memset(ss0, 0, sizeof(gen8_surface_state_t));
   ss0->ss0.surface_type = I965_SURFACE_BUFFER;
-  ss0->ss0.surface_format = I965_SURFACEFORMAT_RAW;
+  ss0->ss0.surface_format = format;
   ss0->ss2.width  = s & 0x7f;   /* bits 6:0 of sz */
   assert(ss0->ss2.width & 0x03);
   ss0->ss2.height = (s >> 7) & 0x3fff; /* bits 20:7 of sz */
@@ -889,7 +884,7 @@ intel_gpgpu_bind_image_gen7(intel_gpgpu_t *gpgpu,
                               int32_t tiling)
 {
   surface_heap_t *heap = gpgpu->aux_buf.bo->virtual + gpgpu->aux_offset.surface_heap_offset;
-  gen7_surface_state_t *ss = (gen7_surface_state_t *) heap->surface[index];
+  gen7_surface_state_t *ss = (gen7_surface_state_t *) &heap->surface[index * sizeof(gen7_surface_state_t)];
 
   memset(ss, 0, sizeof(*ss));
   ss->ss0.vertical_line_stride = 0; // always choose VALIGN_2
@@ -935,7 +930,7 @@ intel_gpgpu_bind_image_gen75(intel_gpgpu_t *gpgpu,
                               int32_t tiling)
 {
   surface_heap_t *heap = gpgpu->aux_buf.bo->virtual + gpgpu->aux_offset.surface_heap_offset;
-  gen7_surface_state_t *ss = (gen7_surface_state_t *) heap->surface[index];
+  gen7_surface_state_t *ss = (gen7_surface_state_t *) &heap->surface[index * sizeof(gen7_surface_state_t)];
   memset(ss, 0, sizeof(*ss));
   ss->ss0.vertical_line_stride = 0; // always choose VALIGN_2
   ss->ss0.surface_type = get_surface_type(gpgpu, index, type);
@@ -978,19 +973,7 @@ intel_gpgpu_bind_buf(intel_gpgpu_t *gpgpu, drm_intel_bo *buf, uint32_t offset,
   gpgpu->target_buf_offset[gpgpu->binded_n] = internal_offset;
   gpgpu->binded_offset[gpgpu->binded_n] = offset;
   gpgpu->binded_n++;
-  intel_gpgpu_setup_bti(gpgpu, buf, internal_offset, size, bti);
-}
-
-static void
-intel_gpgpu_bind_buf_gen8(intel_gpgpu_t *gpgpu, drm_intel_bo *buf, uint32_t offset,
-                          uint32_t internal_offset, uint32_t size, uint8_t bti)
-{
-  assert(gpgpu->binded_n < max_buf_n);
-  gpgpu->binded_buf[gpgpu->binded_n] = buf;
-  gpgpu->target_buf_offset[gpgpu->binded_n] = internal_offset;
-  gpgpu->binded_offset[gpgpu->binded_n] = offset;
-  gpgpu->binded_n++;
-  intel_gpgpu_setup_bti_gen8(gpgpu, buf, internal_offset, size, bti);
+  intel_gpgpu_setup_bti(gpgpu, buf, internal_offset, size, bti, I965_SURFACEFORMAT_RAW);
 }
 
 static int
@@ -1514,6 +1497,7 @@ intel_set_gpgpu_callbacks(int device_id)
   cl_gpgpu_state_init = (cl_gpgpu_state_init_cb *) intel_gpgpu_state_init;
   cl_gpgpu_set_perf_counters = (cl_gpgpu_set_perf_counters_cb *) intel_gpgpu_set_perf_counters;
   cl_gpgpu_upload_curbes = (cl_gpgpu_upload_curbes_cb *) intel_gpgpu_upload_curbes;
+  cl_gpgpu_alloc_constant_buffer  = (cl_gpgpu_alloc_constant_buffer_cb *) intel_gpgpu_alloc_constant_buffer;
   cl_gpgpu_states_setup = (cl_gpgpu_states_setup_cb *) intel_gpgpu_states_setup;
   cl_gpgpu_upload_samplers = (cl_gpgpu_upload_samplers_cb *) intel_gpgpu_upload_samplers;
   cl_gpgpu_batch_reset = (cl_gpgpu_batch_reset_cb *) intel_gpgpu_batch_reset;
@@ -1539,23 +1523,29 @@ intel_set_gpgpu_callbacks(int device_id)
   cl_gpgpu_get_printf_info = (cl_gpgpu_get_printf_info_cb *)intel_gpgpu_get_printf_info;
 
   if (IS_BROADWELL(device_id)) {
-    cl_gpgpu_bind_buf = (cl_gpgpu_bind_buf_cb *)intel_gpgpu_bind_buf_gen8;
+    intel_gpgpu_setup_bti = intel_gpgpu_setup_bti_gen8;
+    cl_gpgpu_bind_image = (cl_gpgpu_bind_image_cb *) intel_gpgpu_bind_image_gen75;
+    intel_gpgpu_set_L3 = intel_gpgpu_set_L3_gen75;
     cl_gpgpu_get_cache_ctrl = (cl_gpgpu_get_cache_ctrl_cb *)intel_gpgpu_get_cache_ctrl_gen8;
+    intel_gpgpu_get_scratch_index = intel_gpgpu_get_scratch_index_gen75;
+    intel_gpgpu_post_action = intel_gpgpu_post_action_gen75;
+    intel_gpgpu_read_ts_reg = intel_gpgpu_read_ts_reg_gen7; //HSW same as ivb
+    intel_gpgpu_set_base_address = intel_gpgpu_set_base_address_gen8;
     return;
   }
 
   if (IS_HASWELL(device_id)) {
     cl_gpgpu_bind_image = (cl_gpgpu_bind_image_cb *) intel_gpgpu_bind_image_gen75;
-    cl_gpgpu_alloc_constant_buffer  = (cl_gpgpu_alloc_constant_buffer_cb *) intel_gpgpu_alloc_constant_buffer_gen75;
     intel_gpgpu_set_L3 = intel_gpgpu_set_L3_gen75;
     cl_gpgpu_get_cache_ctrl = (cl_gpgpu_get_cache_ctrl_cb *)intel_gpgpu_get_cache_ctrl_gen75;
     intel_gpgpu_get_scratch_index = intel_gpgpu_get_scratch_index_gen75;
     intel_gpgpu_post_action = intel_gpgpu_post_action_gen75;
     intel_gpgpu_read_ts_reg = intel_gpgpu_read_ts_reg_gen7; //HSW same as ivb
+    intel_gpgpu_set_base_address = intel_gpgpu_set_base_address_gen7;
+    intel_gpgpu_setup_bti = intel_gpgpu_setup_bti_gen7;
   }
   else if (IS_IVYBRIDGE(device_id)) {
     cl_gpgpu_bind_image = (cl_gpgpu_bind_image_cb *) intel_gpgpu_bind_image_gen7;
-    cl_gpgpu_alloc_constant_buffer  = (cl_gpgpu_alloc_constant_buffer_cb *) intel_gpgpu_alloc_constant_buffer_gen7;
     if (IS_BAYTRAIL_T(device_id)) {
       intel_gpgpu_set_L3 = intel_gpgpu_set_L3_baytrail;
       intel_gpgpu_read_ts_reg = intel_gpgpu_read_ts_reg_baytrail;
@@ -1566,5 +1556,7 @@ intel_set_gpgpu_callbacks(int device_id)
     cl_gpgpu_get_cache_ctrl = (cl_gpgpu_get_cache_ctrl_cb *)intel_gpgpu_get_cache_ctrl_gen7;
     intel_gpgpu_get_scratch_index = intel_gpgpu_get_scratch_index_gen7;
     intel_gpgpu_post_action = intel_gpgpu_post_action_gen7;
+    intel_gpgpu_set_base_address = intel_gpgpu_set_base_address_gen7;
+    intel_gpgpu_setup_bti = intel_gpgpu_setup_bti_gen7;
   }
 }
diff --git a/src/intel/intel_structs.h b/src/intel/intel_structs.h
index 415df8d..2d8bc54 100644
--- a/src/intel/intel_structs.h
+++ b/src/intel/intel_structs.h
@@ -98,75 +98,6 @@ typedef struct gen6_interface_descriptor
   uint32_t desc7; /* unused */
 } gen6_interface_descriptor_t;
 
-typedef struct gen6_surface_state
-{
-  struct {
-    uint32_t cube_pos_z:1;
-    uint32_t cube_neg_z:1;
-    uint32_t cube_pos_y:1;
-    uint32_t cube_neg_y:1;
-    uint32_t cube_pos_x:1;
-    uint32_t cube_neg_x:1;
-    uint32_t pad:2;
-    uint32_t render_cache_read_mode:1;
-    uint32_t cube_map_corner_mode:1;
-    uint32_t mipmap_layout_mode:1;
-    uint32_t vert_line_stride_ofs:1;
-    uint32_t vert_line_stride:1;
-    uint32_t color_blend:1;
-    uint32_t writedisable_blue:1;
-    uint32_t writedisable_green:1;
-    uint32_t writedisable_red:1;
-    uint32_t writedisable_alpha:1;
-    uint32_t surface_format:9;
-    uint32_t data_return_format:1;
-    uint32_t pad0:1;
-    uint32_t surface_type:3;
-  } ss0;
-
-  struct {
-    uint32_t base_addr;
-  } ss1;
-
-  struct {
-    uint32_t render_target_rotation:2;
-    uint32_t mip_count:4;
-    uint32_t width:13;
-    uint32_t height:13;
-  } ss2;
-
-  struct {
-    uint32_t tile_walk:1;
-    uint32_t tiled_surface:1;
-    uint32_t pad:1;
-    uint32_t pitch:18;
-    uint32_t depth:11;
-  } ss3;
-
-  struct {
-    uint32_t multisample_pos_index:3;
-    uint32_t pad:1;
-    uint32_t multisample_count:3;
-    uint32_t pad1:1;
-    uint32_t rt_view_extent:9;
-    uint32_t min_array_elt:11;
-    uint32_t min_lod:4;
-  } ss4;
-
-  struct {
-    uint32_t pad:16;
-    uint32_t cache_control:2;  /* different values for GT and IVB */
-    uint32_t gfdt:1;           /* allows selective flushing of LLC (e.g. for scanout) */
-    uint32_t encrypted_data:1;
-    uint32_t y_offset:4;
-    uint32_t vertical_alignment:1;
-    uint32_t x_offset:7;
-  } ss5;
-
-  uint32_t ss6; /* unused */
-  uint32_t ss7; /* unused */
-} gen6_surface_state_t;
-
 typedef struct gen7_surface_state
 {
   struct {
@@ -407,8 +338,13 @@ typedef struct gen8_surface_state
   } ss15;
 } gen8_surface_state_t;
 
-STATIC_ASSERT(sizeof(gen6_surface_state_t) == sizeof(gen7_surface_state_t));
-static const size_t surface_state_sz = sizeof(gen6_surface_state_t);
+typedef union gen_surface_state
+{
+  gen7_surface_state_t gen7_surface_state;
+  gen8_surface_state_t gen8_surface_state;
+} gen_surface_state_t;
+
+static const size_t surface_state_sz = sizeof(gen_surface_state_t);
 
 typedef struct gen6_vfe_state_inline
 {
-- 
1.8.3.2



More information about the Beignet mailing list