From 46cc789be5a1c30412d1cebc8b8e676c505527e8 Mon Sep 17 00:00:00 2001 From: hecomi Date: Thu, 5 Jan 2017 13:15:21 +0900 Subject: [PATCH] spearate IsolatedD3D11Device into different files #10 --- .../Plugins/x86_64/uDesktopDuplication.dll | Bin 91136 -> 91648 bytes .../uDesktopDuplication/Device.cpp | 96 ++++++++++++++++++ .../uDesktopDuplication/Device.h | 22 ++++ .../uDesktopDuplication/Monitor.cpp | 80 ++------------- .../uDesktopDuplication.vcxproj | 2 + .../uDesktopDuplication.vcxproj.filters | 2 + 6 files changed, 128 insertions(+), 74 deletions(-) create mode 100644 Plugins/uDesktopDuplication/uDesktopDuplication/Device.cpp create mode 100644 Plugins/uDesktopDuplication/uDesktopDuplication/Device.h diff --git a/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll index 19962a124e3614d7e6dde9f79b6ce4688bfbf7e0..488f3e6c5575897964a9519026ab9071400810b5 100644 GIT binary patch delta 38445 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 delta 38128 zcmeIbdt6ji_dkBlf#K@FpbR$!2So)@L_x*-cp(P`!#my*74L?q;H9j=&=N-s-4>>% zluBA!nC30h@sgmak@b|7_0UBdv!}?)sI2+E*FJmTfc8B7@%!)h*{|0=@3q%nYwfi! zXP>?IIRp6@b@`RL;(V(i`sd!GQZ~oWhp3HGeb~?xH*@Jn%-5G^4*c&LzY5h2o%dwHDQh{MMJMH zl*&>R@!e%9XMJSzpd1hz>vBOiidQ%5yI>d)saROo29qRZ#x2a6k~;<2 zImoF-T!{Dq>#MZvoQXobka~a$s}E*Lvd879THG)A$4eN-)+sH$^N~^@{SZ5(v}F5~ zaL?)U=1-HPDE6Kb!Ghg>vQCtx{ztqZ=D7VfE(60P$x@_mav4x?Hu`4EW0G|7;zdir zchLz~knz(bl6SzQ<21?t)P~Eay5xU2s>&DXkAiixT1{RwkAwwNg56RSUI+^o+dGy* zofVW7m`|KS-3k?+P@w?e=r&K1NGUZc-hZqeGLyjl$=|9=R)xl>FqUL}AbXVB){*rF zd@9sMQsydqt{$rX0Vq@FPn;rs)g{UgLH$e9bPe-gHrPry2o=#(1o{p`w6#VA32McpHe)_4QCqL2mb2++qj@ZaTcb)TSrk5=lGFOT z7c37!i?y&68OzClE#Mu8p&6+UAV+Nagz@YT&&UWh;RB^rS8~JZ75$-@`5x=(6``En z&&GS1B8QUN$K+}>cNG;sOgu2+K~KnFTf9cb6Nd)I$|$*X zY7Fb^8{GWXtGu<#Az~?X_lNbjh_vapjbS;yVe%Me^KFgmYrbub7cd4_+VgxYHeaW) zJ*6zRW~?f(Iny;+Bwt|5njH3O@rfikjek|LB>fWQ=v!>RexldRkBJvk$&7xjy?XP+ zUlq*kH#4Y0l5XW$3Y>o}_QRMhxk_@&D%e|onaa@Ptfl|@?vT(9;7L4P-(G1vE!xYh z3RgNxUS{9;PnHL=!G_iH+pNm47uUxE+A7O-vt0oLJkP?YW7KZ;eL$F!w43=fjqO7$ zi){dIl+$#hT;=K5Doerd{6?wd>4M++jq;`{TxGFc;IpMKTi7&4evoZ#`Vg*vG;Qv6 zhO8Aexy0m@kWPL)Wvg_^FVRq*)y`6Iz1mWkTzkvQ@qHOJzr$kdbA;v|n|{wQHoaMb z^)#`K*~D}E)ndDx+Uut!ZPRQOPU971rP|J<6gBCd7JDw?O3JBfH%Gril7w7~?b5BT zmZILD;hupIq<3;dx;EVSB}-ADXKL*4scyC0)KkcWolcNUxZ?PO=1-gc_cV;B2-|Yp zxwc%~>8sA?W??vd2X;!YvoufKJk1_i5N5puZEe@Q#nbg&vyZ1m*OaQlm5yI`p%giM zHI-t^ib_vKAsLp!j`P8=*ycrb%Yqu-bbE8xZ`Ve4Ldw zZ^@EEI?HddIUzl9-4)Uf*GnOTjmL4{IE`K2k|es9Qf!x<#_PvfOz49_$nigfQT2|~ z_#9|XNN=)rq0Oy5Y1SzUUv815+(>lCA`tW(DOetg>5yi%Q+#fI#}NZb$IAaWoi_a# zXrcR3F_H#y`2m{g^LZiv8-|Ka9}7{4wSX8jFk!kx$@JorEIO>K6>B2+(5G@RiGIx8 zI8OAmbeQca-0nxP7<^D4a{-WI|H~Ixe$febcjJC zNOglm(WUHK*ctf<8g__$jNNM92G@WVCiy7q(jwJ}r#Tw65}-EfMW^x6ql~o}9!w2c z=$mlfQs`qT9O7juvUoX-JC3qHTC`A}xxhlh+q8L;T=>mWDBC`<6r4hKGVI(rBj@Um zg}^Ox&soZ*g-806WT8w#7H1nb6c9dY!ay`jUS>g`LEU6YKBxO-03a_NE8k zrzch<=(TT=r#}64{|1>CWO1wPUzDz3zBvrbwDKAo3c{_Dp0>RYu>lbeOd*{@Jm)P% zI&aLmSmI12R*~Kf_TejT{bJk|=s7CsJQY?HKA1#o@AI`pEJ>jBSmN=uhpzNI8FKFd zu5kdn84+&4&5!kk@rO#vFxK>EK`kxvAvU>Xocsn`*RrF0m>q990#|?206Bq;F!hgs z%d6~plPs(5^Szs`JHwNid4VVznf%AHwOtBvwO_FJp2xOQqi2icoj z&(ULvQXvIF*J;!pU;$CXQOdNa-j>(-U0XMgXY+LZJpK?*i+OywDopdZW7jjd4bE6> zX@hBP)BPFtP1JAle)dJ1XXK7-N!xwcAhc<>LEguXv>PVB#yq1laLtVFX~FaJVv5aN zo6^fp4~|8YPK~vv6x8wu$26W_P|F`2V|b>`o`RX;<@KV#?o?p!_3X>&IG7KJX^Cs+ zm?-6?6KrhEIQbQ}Kc>ABaDsgn6QUeG!G4Wt6ZA4Q*@LSswuxAyU_Cn-qp`y)tV{du zQ@Yb=$>pP^`~>x-Za=Y#^j(r@v}8e*MoW5w(ef;b&}hM2G=wBDE*>EsZfy*^PME7O zTDpLn)ty~vA0D}fj~4w2o}uqYq7}NW016el&E1(-Y=3#rfg!PRvb>wccMN959k$Ca zfy$O&Id` z>O4p}v6k)Z+)LiUsyiE%xog?4o!cr;A7U-L7@NN6x@DKb1-fOMvj@8L^Qt&VLuAhm zR@5cJ>jj=D*uf5TDOS!ri^WNEmYFb3HnFn_TjWxfnfRdmA}deK90F_FXWO4IP`ZBd z{|`@#$-kN>(52m1(FA_xmQs$JAgzY__3TPEzH1LTf^F;?DQ{rkNT;TN#dRCj5>_#3_$TA>|IWFA%cXMz7oa9Xwo&c$1s&Ly zZeu;sR!-yF&$HjUweI{p@3%_FZkZ%%@r-jC6Cu6Qp6g?&7&r^XNVohfg^!{nwDbDs zSz7m0YYUPt3SZk^JXi`qG<>jxmXp1A96i25H*9>DX7m}*5)YPT4pPevd=-yvyu^o&8&3@_8 zGGaTG*Z4WNXe*VboA@g0(lbs+PmtHx=-yGmUy(<&>yhuAmUDfM889{+rwdqd@9T;+ zge~b47qVm@RkIKVR@s*YU;=p@W681NbM{uBZOW93Y*OFWO79-*iN5=k&z7^!{RXsI z5meWP=2Y8{$qCN1!bhu8ibhsJd+jS^ZrkPqoBB18m06D-C^NT_m6*T-m-@Gsl@`m` z?EyWM^Gy$Q9N1dM^6AF`Em_W>Jzh4fk1@kD7MaYvYOr>68s}_4B948V{ESx{&e*=5 z^%~rf9elv*wE(k-(|D`+K(E2=*)2&*@2A=CmX9GS1q<+bZV+?uvcpAX-nZe+Vw^~%|@h5%NR@ASj4-htf+0^VPDm3oriHeUGHH8 zPYVwNRN*=grz~XpAsv)Iide595fPsj2@fwXxW~gc7qBHmwzmkQ9E{zh3NuZ+QiZt* z0ea58lyw=pu4PURZ7J;cmC?Plo&9_0Z`PsS>Ydy>Slr18AR6Au=V?S@eBZ=G;uv(C zZqFcSi96Yi%WLoCNkaZ8pLlM;H{8kBFw*Y5lOwEX1hTyjvI*zu!8qaOi$|T#i{c=v zpwBB*H%xb1VSrCHjK*w(b@Uf>Gs8#Tl*u^qb?w99I5dXfSJ(mw{3p3v*cYgCm=iH$@^>k5j61fvjJ8^U<4i z;s#zBMdyjgSVAKHD<`O_!az!`!cGlCx{sx+;kcLqX8(A#AUggX<~KaC`RQg*?^T%_XR#S9g-I4$ zcsX$jjeDB0Ny9^wPqW#Q;o-{hZ1(JMixM}7RS!2Aes+Th&ELs*@P*%L$_yinVgDva zR(+b=jQVrVw@zo#STm8$vRS_oEtG%FW|Ky=w&n(qb^XH}lB=kFaTuYS#M5|?6U(0K zX(>vpvJ`rmllsIOpkUJvA^}_SRV=Z3sARRJFb%i5z6)2?#j0EfxYgiBsoZdtTLZ2G z+#svU_UDjRlRKuMPg7JzHm~k;#vglxB*)zwXyPLMC8QkEbY)qUBNEYy4Yvwx4o7LZb+li%~B9JQ0%C@gYRkg~^*^%xZwSR^AyeUv8Q5EXT_ z8Q7zvIx6n5Y}h!95;l|lJgTemsXvPy-Ab8!m_0Z;Oxfbk=8le5LJzZNz?|gAj*cEV z*$ZXl8L+baNsl3ifMIVrV{z)fL7LMSFBa-=J0oKaMe0 zug&viZT{U`jr09OqX1_ERIp@yInRcbg1TJF8Y!P_m=f*OJ+*taQQ}Q27o)W>Rq}@L?7AaF$ z=2W}#T}GXmO}87%JS(%DX?FPzimO3T&^z| z|J0XT*S{eU|6x|HvS$RFKD)ay<5)UTCkDX>zc%-L9*a%`s9ZuoMC@HWD2}drzz%?8^1^_ za{h6pQ!322WPi;M4f*VPy^#MQVfgCL66=)nh7vuL-N>1%G#|=FE@-1{oJmKRNlRz) zby3~xky$)lzs<|wX|c^4stQ*+UL3+ME@(wQeHDaD4Z!6)jQADiq<$4+G!4zwQkqGwibcC}|h>+yIa;vC_1 zYlOw-Z?ScwoxVawAfUHYc#;*?t5>*}x23|3C#Ljj9Xc2SE6!5!)ZUs2j1?{F(eK%* zv<1lZqW$C}pe;SJO?fRXg`F%#!=jzW3N_oCvL}EpzWE~zk&|%mvZIpeazFHYZwj}; zg{DtoH*+^C!BdzuFEnOnCRF?l14H~{@WO>&HsYHVvQ4jsz6v zSclg`Hhm`KF)S8i#g@hu29QF$IF~JZ7z$QsDA2I!6Cn)2HV}l)KsuP!2)~NnBI_T* zQ=8sPmHq7-E*q?o^|igv&%4Ve(3?U>#TtkYPRA-D-8MKCFsh)>g^yjeIQorbZCs6E z4C7U}RgPGHinfL1AJ+pM<({THRaDVNuRU+u>Ii?w4Dg{B4@N8g|D}A^#HO z;a95GFT4%G{SLn#$;24|IW`fFEhfjt!LfqB*w$*f> z-D-xLM+ZM~uh2B%IQ+cRNjEg^JWJ7Nvoqc7h+4}YeXPAT1GkQ)FnPD7@Ue1a?WS2| zsY5|?6MolGOzGG#QE`k5T>6FjkX9Cjw2z<6+=$NH*LWhL#)i40@(8`3Nl9 zVetrTkPVU3?3iHdOaQ^7qaP($Fip%@1TT!$liK9N`8}l z`S>p7jY3vvU1T*;#hP!y+uEY8KYvO0@h=~s%KSe58tFy@r}Hee@t%W*@L@5we#XfX8g^*d^ta#V zagzi^;@?;qIof;F8V8v$4Cx%?S71#~eC#L zwhU))u56_&8P5K_a<%gCyKMHVD9^E)D9HR-QRyLGM`49xcrF>_v3k`U5qE-QBHe zsGOsQ&wcNm<9BWNY4kWhW;sgZuE8;jCwYy%_b#&Vc{i~)^Q+?kf5Wb0NMs!P%PFAPU!k*<9@$qb6h!FYLm6tQT27!)-N zdEG=_Cg>;OH}Nwdu$qW;Fq4IV1x%i61~Yo3Dv9rFbQ6U@JOtK~mPa(WKcutRryoda z@S@u0?KJirj3M9}9G4!T@lbHKZZB!EdD8-A)oQlvY0H5hpYAGqf1gY%Q}G3Xaw(am zte>pxO=d5zHz{k9*~Rr8T1S9;a$IQKja4HWp>lO!6eI@jX9&OK=r&RvFVf;gu9 zGDmw%dF!O=;I&J_!S_KlY`sWPU?Ge+zFtVB9)gx|a0i#yw%(sK%HiO+C!I-*H0_v)nh2df$G!NOjTrMl%Qb zwg>Vy{ii3mYZoDQuWK``7@53hA?s?q4fC~)w*~styK7;9_ih0%P}{qqqQD;H;Kl`1 z>I`U!#v6H$gZpSkfrH+woL0#8Qa$W&Uk?wZsIs50tatEsw${Nv-clX>?j7OaS0Ebp zZf8;8b1>rg8Dj&Fd1%4G@pN+>;0oF%)C+~#P{0c>$UrvIWYZbz`_dzuDEmD+K2z|%b7!#O| zp(T9V!R58S{h6xPWgO%&8$%SGx*THncIt;I!K!RrL*M$%VXtjzW$mIm*R?g2Q|L|O z@4Wc}>s)jl0ZipZUUpot!o@b+#b1w5f&MEuQ~hklYAnFinb~y;&{OC<3mu!j65{mcHeVg&ybn(E)|gwb7h=JI6I9o5)#IwzzSC@YX}JFwu3D_}R-E2Y zW(?0D*{+bK?=9o;Ov9V~BrK>*lW+E$&R#2BrIa3E-Cl@lF((BD7Uu27RT6h2Ct9YsAMIVuj1SkJ7yOh__zonT4y%^{>RkhAf z3)?2Lq!&Ay#%fr%5@-lPvkRE~>ohr$t$MNNfaKTf`zAL7ZQa36E**?2=J#ILa3t%S zn0L)5OQ~y`KoR19o@DZl5aqy9)_lihW#j|w){Z!(^#iQ=&XL{6V8LxE#K#qn;{0@i zftTO2i*`lcnVNyzYDR4C*B71HuAQR>E}|^g%6$wa&J7H~Tfw1TPGcu+UQgA=Py;@I z*YaC+X1#aCTQ|K{UqAnqyVSAwC_Sge*qaZ!zJejPro72xV9KVS0AYQ9Z_>NAdCz}Wu zBkKpTn;zHvhhFjgnroPZU)adI|2tUVCX@zukK^g)W1Yr|HpvLNifl0qA;7KF-X1 z`M(fakezmnml(=GeSxh|N^A)X06$?0uNyamiCYiSvFz=TKT93S} z^+pWEEi^Zaq4+fDdT(4qv400D{81>wp?MHN;rAJet$5+1RIy}LOzWd-DE<^n<~pi! z5l3h!Ucp+DPlAny;>Y6~4#kg;ur{xxDnE5#i(YA`^xVU?zS2nvJ;E-%QtJ629s`b- zvsvz5YuhhgLZ#?U>Z*JijfJD__%6v(@W?EQAN60sWbDvo9|+yoN0D!^v9FB|w-amb zTpYL$(m|sl*#JeXOK|v?H;$cuZHHp-$+F8kdOnBg*RgyKd$D}4PpjS%ex79L6V&@a z#{Q#9>m8Ux93C^VNc{9Bh6d)jJVyglKBHl3AX{>9yeCaKjt6G2s|Qo8BQdlccc!Be zio)N;U@quWwH@mGd43Y((g<|8?{ZRNwRh; zAGv8*$Xv(ZYq%5bC*-$4-lo39h9PS&}|hP&YtVTSk7 zNN!KN(R_hwNV^LvKkGp<+D$E=wo0wrZn))Kb8Ia=zeR97ob~+A(w&UBb^_m_=CdPre|}UJGJS}uYLK| z%&!CZbr8Qkz^@j59fGUt5jA6mf6JAqHLUg0fAO3o-Og)jId#e~Z*u<37giR+4-RII-c9eAxk zSaaJyK;IGk+x~{M8vg)Y45tJ1owu>K-)i6Vvu;jj-ZINHouND3q{d6#n0(@yz&MO> zwT0BLSMvLee4f30A~w$X3^HsV9-J`e;VM}hx`g%uPw}KPg4@Nu*>!?eI-~<_;i)s>YiY~mF}!8)P27h zqJ4gMI?ZcpSK|xAf<7hSD6Z12SSdJ$pn$^g{LQTIsqxCJ&200j>&ob0w&L{T-P;7A zk6oYbd`v$ud?$dajn!JKrgThsmM1HZdAmz?-b{Gcek6c(JJZ@a62riOyA0we7=x`R zN~V{8SYX>}@Lhla-Vd}UcA;+LCRNf5dJ}RgblKpL-3r|-P&6PabPEM_#ET5iwNrD= zA?Os=LX>#oAH-9~TpvUl`e+XIiv4V1S(MKrQqWocuQ&qv-1_ ztl3^Lu&!sjDi;iF-r3g5bR%1THbR+XWc$yCM2|F*_5NO%Op`bX>!;4tx0c0r8b#=g z>__Od;W|B=*Xu|c9hlf3NY?nzTW(In;}0KGO^osyOTXboE(>JS-hM!7K8?Ndc7!rv z8hhvMn1Gsf>MxD`U&Qw%6}r#XG2OX%W$+f({an9hdB}A3FQ{~HQ`67sKd4am%Vt)1 zF3I#JT042wr+J|(zL5ND{8#)Y`DaQCeMu5R&u?a5oa+)g8$$j4k9`riD7!*uFH(!C z&>bsc9V+7E)`C$`=~bb76a?0w(w$_7sZf`PRBp3^N>hbyDoE5pD%52bu{9N~l=LF@ zYDH(I^f~rLMVRtl6ZU6Ch;p(C3$E;^eBOj*RE|(aG+}!yTQ(2CZ9{Jm&G>05NZbKF zcRp=ykJN45#BNk}?RC_K{9b4B=3`wD;xyj&MbefWf-Msk|JRVhXR@7%u2kuwG?SVx z_hnG{AOEinS5JP)UFCbW*wP@{S24Bi6h-zq`E*=7tf z@KITjejm~|X{b=Am9YPuZ>9Y591FN$^j_DOm|dUh%Q{^c=siMB4eiSwz0lqIGV0=N zvzK3A<=1k4y}+**`SlRL?&jCc{CbUFZ}96?e)Z9lohJP1$FBx{ZOX5K{2IisA^aM~ zuPr<|obW!7^p1zD`1vyP#iTx?`qD(VCK`3QY0=QVHFUg6n@Pr9rIU!RWp7-J(jQ2M zg~H^eXo@XE*o}(`18LT}SogX2DgL?lNzSW(3Gy0G*B>5i=V@_xu)&8-ywqF&^Wb{l z9BkL6=x9%G+8q|@ZVg2a9$Ay9cU0$hYJ@kDu+L#k4)p>f$w-NZ%aPo2|Lr-fH?A)l5}2LseB=s%BFCx|h0ScKMf! z#Rokpk+!Jv<1z2nrEhM8Jo0$Mu2yMoXL&E@G|C|VZWb@8Z;`C}0=UvBRY~nhm5wK! z-a^jxn1(IRKZ_ldaOUQbMeNyk+bV`7?8Ljh!WlNRs;BX|3vTZ0$pvSTu}wW$P*p4I z*E>1u2(f0V*=C|Asx-HsuF_m)kVYoyBy??Ssz|;A(M4;jiH?7P({`c*Re3JsrP7te zzuSY$%rsG=Mor`sJxXfS7~14AeAoc5A=YYad z@?Fe%o56Kl8bjslp9SqSR^wrdMC8)|%#^r$7US#8_k%ZxqN2mGEKJjQ*;@odRnG_QsDyDU1=gP+*zB;{v}I7=$08 zQpgfmD)2jj9R{iSO9j5l(JD#V$!f-Ffwck?#h*IK6?jPCU4gyv+h7VS1zr>wW>NX$ z1@0F3r9i(FHNOKP%9nZy#(06t1#TAjy1)|xuL!&&&|`>du&KZZfgJ=U3A6~DDli8~ z{D43%pxBoFJC$*2FWA% z`xO*c3Vc>zxxh++t?*YhD1-=91b!g$zZJ-ZaJen=zZB@=Z%(tShRV}aEEDJwI42aA z3!EYHeFPp6ctPOT0zHPQ_F4(-D{zd!EP>fpK|CVRRj?!sJudKN;lM$G7QsIu(!E8x zi@<1s5ds4Rz9{5fRaR5LhU1Mk9q*jhc31qqNc}ogX3PQ(F{&q@t@FLjX^+ zC7(>OT8wIIQ64R!%e%;ui4q93a`w{6+{U~M4Q-fbs{Cq!lE$HHh&w}>g%^f6LnV69H(N9;NN+hefw=()2l+;EVL`V zS^HZN)*5fM0S$dst*b)obAkCiRerocS7}u}RQ|U@uD&!OpQNIxyNY*(oN`W0d#R{S z2CLByOJDU_GXM6mwB0dndKbKR;HlkBL{Dd^3grSz$EoQYQI9Gicl%!|--Y=i-zAr> zSM60bu;-7ze5EzWF5PO*LjGg2Zt_>fUFKH%HB7ts{|iHeo#NdMt6_evVKwHxareTR zIfa&!gSWMQ^Gc@mJISCH82`E|=)&^-YPwWlj=*Ap8KS@%QGh`>Ue(9}Ln8;$=4a2& zoxiYW&k@tJv!=7hzuRnWrDLJ=DrHazeiH`F1!5a0l>$vb3dDEGW#SiNa zQgF%PV_9h)exOK)6>EWBz-pigNWmosl5MXIu!d;zXkwtUNT%@wl8y<*1U?0q9FR_%%q!i?pjO@+m|khn<#WM%n})y8qDGnngcU7l9_L9HeRALBVB%$_muTkVU+$9*tsY`eOhbhSPZU((3AY*U$85%oThoE_=LKHN`ksVb*VUoL}<3#JB) zhoA{a;lIgw-KSvE-xy9>YQQF2Do5HR(tIuFy7{hY1|N<}Bm)E+4=OUHZ5b+{R5M6j zEl4%)9bI2A4d!&D8@G&%L%RkB$v`bz|9vz5c-Iz1IY%g`Ph%%2C#T*2c9!Jg$%6HM z794H0?NUF;8v9WC59KocUQX?Fc*9pNroR^?5gw?WYufy82T9KUKjlz92^RlPK~*mE zAIio5LpjO%4+X2D{#lJn|A8EJex{J)?N4LCHIX##!kxaJY$6({}xOy&0RUysGizy{a zD7ea_2{XNsMkb5Atf)cZ&4 zm1?9LPtR0VhDMI`X0aE3Xcp8AR8{+W3t>p-#IiNDZLNkFjSFDkuQ{pOSMT>c0KajS z@*!sepMtBoc(ZGYrwU{ujYX9@xX3dqm=yBikSpLAUn)nsQZQU{gxZ2hFaACiq5jS4 zTyGC=@1$}{3s&6|l{X#sq^>{)XCZA73|EfpFZ`1HGQ?a1{WV*;aD8MTOaIf8?fygWlZl5W zbg)-m9~la+doK%_5FtZD6DtSeu7I;mC(&j^GJ#Oi$wLkzle>||_L-Z!>)zL{F>@94 zCeL~^q(`9`YA&wU^llwH<_z;ag6wDy2zYR-Rd?Nk&6E@&6ST0rKGGOQ($t(3w8o-6 zSlFMx#kMmlE__c2=PH0 zrOg7y!$yv$jI-MCfo6E>3R-=yM&%Skj(nh?l|xgZO>_HAcfVGr zk*5tcsFjPO^^|I=4IyY7*U%?EYWe+N?&SV~1axd}(}ok{kJ`MZdeoX1g^a zX3**orU_zlx~3MH8k$Peb|j_Aq!|$%iEDk(da13A%gI08`MCSx7D8hN9yYuq+R#w8MmMSVs221rP1@yW7247zr7hN^cX3roudMpCRxYWLoVmUn zw(*a^k_X*n4P)O>8@1zmBe|-!INgl z(h(Gj^COpX9hSq2i>tMg@9*NOqNcx*E7jAzZbfU3CK)t{&x~dM*); z(SIig+peJXkjis~l7l)qfV$8Ow{cGAYPWJfx#Tq+9)|FqYJ?Ltk)>Sq=WRndXfbIM z&nYRFWnCLh)sx_4m8Kw9fmKxPFe|l6DP_a=#-SLk?&50wrk>D-^1m5LR25ekF>=tz zxPG;fJ1hkcJh7vA;N_9c`(b%e66-0?_Kt!SMURr_J>}Nc%yW_ympgrFZq&ncC@$rH zBuOTqix(9iFO`BN9+#^EFUbU5@lO=65|ifPzoq7kHO{9!TP3JY_mMOjn&^Fkb2X3BV8NR5^^N|mc^z*FTUoLJVjL_tf{ z|IJXFfT1h9(osvv8Q1@qh?}m;(Eplnhm2M97rxWQe}CvH^YyCW;Zt91p1{-eD}F$M zXG1?ctFeL>a`<`~ArosCK%8oyFFJE*%<$o`P^!lG&P282rY>5<<#X_?_mdJN*MF3t zr7l^In>k~4)}km{Q)ARY2@tn%(ZXp_@tuj4SzMCsBlm6p-G>+_wRnFI9^EiBND21} zJR`}P(QOP=Ad4yl>zp!aVKIK*atK@rMd5DtpVM)&>au;Q{u_U{R9F%Ynr(tCKlL$$g zj~;TRi;*VYZsdpJ26vx|(=*tUYNe9HP2`wZ6Ar&gvBo4xu^=cN8mW^)rUq6w%?Zdf z#H$Kdf0asn^>XJP2O&TU2#U1Gg40qZcxIq0)Sw1QNSIv=V9Sy`J!S#QqVOk>RCQNX zQvpB<9f4#v)JKtgx_G3MvnX2%^>vec2Y9A?)cYfaw(^o%B^soFh58!bYHzz|jz=cR zmqVT!%MM$F7lBk3LP@ZntdFaPkULU@jq9=#ZxqZVD#F#PB_sUgVZ*Nq2d@hUm5)^c zt)o=%-#N8fIAwqyIn|=%M?X2Z<9~ByHC}?4U48(gOS<~YL#@%G6L=KW3OX9_#(fYe;2BAwY@&EE?|C~^ABox^C5MffZ2uMBbl&}V2v!xyRanX9069)+(!AtCfE;0Mf;S+M)a&&3Dsp`!ymgdjUA(MxKX+e~Vn)l>>j43K=UxTjME3~+O*sI=h|v|>N*cFD}9 zawOfhYnsZff~Y=@TD3kV2vNOoYoBf^cjGN*N8SiwB>s~UpJsAPE8dfZW_e42iC&V& z2!;1t^&e>D2UPVhffRxVtLe~qAE{MVkQ9+A^3jaqDWn3a zIWvH$t&|0%(Ul|8Q)#49$P@+8&*&+94kX1Oi>f#WNQwnOy2+jq>HR=Ddbk0k0)7ON zo*@Mngs7B~_JQaqYQ$nVH~>6qmwY%tVJ(p4H;Hs6^eF#1q5n3J^4&2{ll{R!N00m8ykcuc4eFO$2g9e}!5;o;uGA;e5g0Amk2-bZ9#d zDI_ZZJ!O!*uDIt=g+eqfUM?zdT%cX(-QjkyPH@B0ggigTmndjqAUSY9!!^IFT}iH* z(p0%IKnl}Qv=lrltm+e0R~oIRgMkzR_;_vtM|>rZh3a@thfb-GJL!@O_mILd?n5x{ zeMWfjaUTu2_zczFC?JK^A}t4cl^h6?L#>8!lGF{c2Jht}Aw+VLmBfSexcbb5khIp_|`PwvetaVDE&D|w^qF&N(@JJ`) z826Go%QTUsiFoWHZWM;JX&K8VdR~XNrtVT(iN?|qNtSxT28GOr)K+*4NZ~h;mfi6R z%l(Oam5YV4d5Wr72&C|~NQXw#G*jO#RNyR4fz?88FdU;$0HkhyN~GTw=};^8TF?8I zjF^Ry8X+)cnrh&AAQ`w{!6BN0?Lsa#OVyhRB)x}4dXGrE?DWt!S&b7P#Ho5xl@RPX zU1cl=lA%XL`bf!w5ILAnLzNn}Y9TgchN|`?kkr+=+Ibd8 zb~cOjhibaSGgJ=XPT+58*7=UE;KFl&6v{;UWs$xi()V*BU1P^ETeY(UNa27;9~S9f z)O1M+oajuw7p+k?%~6$~0#Z05(iI}DD~Svf4Jc{U;^&Hr0x5hb(w~TQ&^$H&e!gG* ztG*4)LhdCXg|9^V8|P+Rs-NCIkPjfF#K0i~M6k{)hh}Z-BfZN3}Nu$REAd zlK#!*;84EW_!CpB$p4b^5rRuzaAn((9ltg+ z6X`V~eZPTKd$)dIl?%DxJk`!fpwsE=bY=*~#*!afh=EMEW(6zV%4S zClPWOA6j0}p~9q3RoQTX@yk{I93X|=KpA*k@Iy7LF@qaUC0+c-xVY3ENOnWRb&{{# zR8pG@k9IWJYKR0x`Iby*iFE?MI}|dFG5ENu)Y8h6Qa2zOG3Kl34nS^Hvz4|(H{HeO ziyA$qiYE0_1)R$l`6(+@JNZDeQ?x?zf~wd5=JyJ#OO%v`8W zBWXZN=M|Q`ZW2x=!O7d;Q3094iFv}Qr9d*g5@?4m$+)cn17Qx3Z0!e<%yFO_@GFtl z+tmCUYr#bL1xWg#-F&6!tVAg)F`;B+q=t-X@Cn^v(6!;V z3qBR1_5n^RL0=SnlJgPr-oUHiHvxXFqE)H^;RnWDfv)`#VSrEs@DN|5I=K-@L0+fU zQV*n7FadQyGmxAd1SDsc0;%vqAQip|s0W^0hk;29`Zb3iFdpa+>;p6aM*=B-8juVu z0g}O0Kq}xlAUU}Q*c5mUNUivd;C~M!Ii*-_g;1a`(%pb07i#9qJ9U)Ppv^&7^n?Iq z8m_5GEs-x2Du5KO1F8QbOCnp#o%ndSK=lc*NYx}%I{-;6Nu&n>Db#FG<+d|5eGy1{ zw}B*o7f21-dZU^i0;K#YKpJMPpHb6tv7c1@bDNTPTg#E-GQo^2!6K)lx|-LfwTCDs zI7*>(vuZ>;1=Y&LC7X>;oU;`c_Ew+EENie zgu*2t)$qe@C1Gu_6Q`LmAA0z%mlqTe;*M>YZ{0R5L)femHm?aZzpTp722xlKB)e6D z&o@6=9#S>Zx>qnAcTn41o0fgtOAfb@!)MUoibp|M9dIY4&&VW3H;`%{B9I1~d9TVl z2BhEsQo(--e(*kZbmRa@cO{TU#gTm_J=@}WRE@Ozt7w=`!XZss-Sc|aoxOO$Cki>Q zskXKNDO?rl#`4wN69|;6@~%cGM*0mzG=f!%M81Y0p%o;bM1RTWb&niX!B0wmU6K|c z4vJTu)TUK=z2vjOCErBKKOjjjAm$4B25CC%%JP!(4@%OmgGu;^MATemh%^`SkaFI@ zMiF~GI<2Y<1d@*ri}az>CGBJ6um|WCq*p)`0^e43x&kRI5NXo$rn7=p80nCw zbntmedJ%Cq%6jp9$(k6s?+jO7>^m6oh<4#mfWL?2k3ry{2<+mU@9`8lXs22n_y4a#A|IMeb7TeYsOGAJXUVzQOip%nG-9A zx!Dux6|_<_wPahY+)kcWaxPYmvvwE%LVZ|w^~Go>7^1io{w8+A$`X;zWoYwVm5IK~ zQTIx;A)+l8ZFFdBN82^p3(z{AHmS6~q`k6v3V2y)OX$*Gh4vYA3PQ_u(_}huoDPF? z!GItg4;Tm`OuKYiiM#8|`x#6E}v5r-m9K%9rT3~>db4RIUd zONa*$k0YKzyn2U8DG`w!$MT2M3 z@N&RQ0&kY4i~*^zhcasVa(h;8bM-L1PlceQGC6NIcp+b5uxNM}z$*r?Qe*I2@Ty_3 zS|ew`tL<9IRcqwB5D#+nHq;f4q|*!3>h+O9|M$b%|NCL>|NXF5`v2_@Ye)Ql|HInD zSGvkoz9shl^7xV$`^yoB!v@GV@DHclN}sjJ3nH(p9|pUoqPTwj$K)={nLc@T_Kf*v zGxl>O8!UK~UN1Rjk-G!JhRR_jO;Y5pE_z~$+y^v%c1}{KQ{+yroF+pwQW|>i5IGq# zw})^I7#!@RurJf~->9942>sN4)JpHyxaEOKIDs@xC21wKrbn}fcs3baa- z=ijeRlhdbUnHS||QI$}q*VE*G3j>D_4U6E;#$Qd9CLt1?1Jq*&P4BZ!z~RlH z7>JKZfUb`{2vY;GYX_e&3vn;#9N-zm1(XT*Av!=4zKK{%MuGo9^uh-rH9*%FC4}E0#)D6I7jY11 zsg)$HX^ka5=wjf+HsA-tY2b5+)Doq@{?@i?A|3b}BGp)Gho+83jYH6kK#v$vOW-0z zlA&)NK1B2i#p4$^qP<#U`lcZ<7R?L38CZ-+@`UdrQo+^09vxKLY6cPC5sN%15cZBk zzmhWWuXuC===$#&uypE-FV_%jz$cuE=#Ebma)86Sz$oZ+;N3*L`37z7ivC8-1Z@W< zc2gZP16y=Q|1U*G{kIMHRH{4rF9|yg@Cn-^eg`@pc(w-&gU;_+|BVBE>#!Ix1m80d zZt9I6hJz-24>1*VHE?MkbqwVL4{OVGRXH;2OzDFf;A4U!=og&5ru1p}`j z()>{kd}$;K0KXjAa+J6gfj=TQWxy!y zNL=s5weP>_J$N}{CJYgNiI@wT@OQ+OptY~L>Gk*8N!Y4_Pq+i|IB43%Grx$syYA>=!g`kNRffzK;YSSdK_Cv={pf(EvVex4xc=u>+d+ zV{c5uSOHDjtI8~l70|SA`)E3S719a{Ag<3qpMj=*+AlLPae$_cp>8%tGHBYf1?a-GDI*;1Fnfd$%8PDQMc6_Fsr51x>rt^N3eL(+2U0MQD|_xV39t<}zo+JpFWDMn^H)OZ<=8L+e51e$i3ZjWMr zLNxFWVlS6Olm$_3v@d0 zQ7bM|43vTIu7CpQD&Xsda0oQLX6R4^etQ%QTu_YKgQnx>9_!J(IASyd4~zQ=%!_88bo=fi2wK?#Sngj+Ua5QC<(;PZ&{K-2ke&=wQ`+5~(b zky=7~fU7;+r9<8Y&to7%p70mMpFtD4ZNn`ZhsppqZA1SDB0&eXw-C*sYk=#wt4&u5 z>|3hRX5bfst^uxlLFE?%<6czhc;I`2t_H5yA!LAYJB1AJJwaFRv_fc?5CV2CQ)x5s z3qjWa@4lqgSlW#@J&5^m6n~aNI)%vlm~ap78t_fPZZE6ybYlED;%@M@r@(YNT!mO; zMFtUHAiCp>vIf{~FK#u^bn1I;9|js|?FlZOz%3qB$JU2r>S{8+ zC%IoCRzZeNX^RkX^vn-rt>TE5AJvZBkHU~aI1@1uH2!9W)arHBsP;sbPHJx;rbC8s z@d2y@L2FN8>2$W)L9`b5gv${(k_>PcA}VR+g!v6g+KCLpxrj$V*Pp`5{B$6A@x1_=AA?h}7(>fu|5@4mb;}6*Qr~LggEP zNrFzYf=CmIbl`qO316Qd1b!{}gtdYu>|d!CHVCLck6Q~)7=U{aFM{3+tU}}i6ZnUq z?*fNjQ2D9AX^4FNkG~Wom57W|U=1SGfUx;R^b;Iv0o;aY23-n#<`U+A(3^nYA(GRC zF_+bmp9q|VNKO#;co+9OWO@VlA(n#1fv8pb0SOW^RAFI>Nc2kJIYe5DRRSG|^u*)% zo=STGFJHl307G8`V?My+6?6ySRm6*+3I9N(%9#Fzy91HvLBMs0(MHVw#UMW62@JXq zaeE+=P%-c(B7J~MN8WQk!k~gt{B0&_1L9TC^woFEtGH{hwkJG+7!R60s-_R3L$HLW z&zk8I +#include + +#include "IUnityInterface.h" +#include "IUnityGraphicsD3D11.h" +#include "Device.h" +#include "Debug.h" + +#pragma comment(lib, "d3d11.lib") + +using namespace Microsoft::WRL; + + + +IsolatedD3D11Device::IsolatedD3D11Device() +{ +} + + +IsolatedD3D11Device::~IsolatedD3D11Device() +{ +} + + +HRESULT IsolatedD3D11Device::Create(const ComPtr& adapter) +{ + const auto driverType = adapter ? + D3D_DRIVER_TYPE_UNKNOWN : + D3D_DRIVER_TYPE_HARDWARE; + const auto flags = + D3D11_CREATE_DEVICE_BGRA_SUPPORT; // D2D Compatible + // | D3D11_CREATE_DEVICE_VIDEO_SUPPORT // MediaFoundation + const D3D_FEATURE_LEVEL featureLevelsRequested[] = + { + D3D_FEATURE_LEVEL_11_0, + D3D_FEATURE_LEVEL_10_1, + D3D_FEATURE_LEVEL_10_0, + D3D_FEATURE_LEVEL_9_3, + D3D_FEATURE_LEVEL_9_2, + D3D_FEATURE_LEVEL_9_1 + }; + const UINT numLevelsRequested = sizeof(featureLevelsRequested) / sizeof(D3D_FEATURE_LEVEL); + D3D_FEATURE_LEVEL featureLevelsSupported; + + return D3D11CreateDevice( + adapter.Get(), + driverType, + nullptr, + flags, + featureLevelsRequested, + numLevelsRequested, + D3D11_SDK_VERSION, + &device_, + &featureLevelsSupported, + nullptr); +} + + +ComPtr IsolatedD3D11Device::GetDevice() +{ + return device_; +} + + +ComPtr IsolatedD3D11Device::GetCompatibleSharedTexture(const ComPtr& src) +{ + D3D11_TEXTURE2D_DESC srcDesc; + src->GetDesc(&srcDesc); + + // check if the format and size of the current texture are same as the source one + if (cachedTexture_) + { + D3D11_TEXTURE2D_DESC targetDesc; + cachedTexture_->GetDesc(&targetDesc); + if (targetDesc.Format == srcDesc.Format && + targetDesc.Width == srcDesc.Width && + targetDesc.Height == srcDesc.Height) + { + return cachedTexture_; + } + cachedTexture_ = nullptr; + } + + // for sharing this texture with unity device + srcDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED; + + if (FAILED(device_->CreateTexture2D(&srcDesc, nullptr, &cachedTexture_))) + { + Debug::Error("IsolatedD3D11Device::GetCompatibleSharedTexture() => Creating shared texture failed."); + return nullptr; + } + + return cachedTexture_; +} \ No newline at end of file diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Device.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Device.h new file mode 100644 index 0000000..4b6af1e --- /dev/null +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Device.h @@ -0,0 +1,22 @@ +#pragma once + +#include +#include + + +// Thraed safe self created ID3D11Device from specified adapter +class IsolatedD3D11Device +{ +public: + IsolatedD3D11Device(); + ~IsolatedD3D11Device(); + + HRESULT Create(const Microsoft::WRL::ComPtr& adapter); + Microsoft::WRL::ComPtr GetDevice(); + Microsoft::WRL::ComPtr GetCompatibleSharedTexture( + const Microsoft::WRL::ComPtr& src); + +private: + Microsoft::WRL::ComPtr device_; + Microsoft::WRL::ComPtr cachedTexture_; +}; diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp index cd26c6b..99763e4 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp @@ -1,85 +1,15 @@ #include #include #include +#include "Monitor.h" #include "Debug.h" #include "Cursor.h" #include "MonitorManager.h" -#include "Monitor.h" - -#pragma comment(lib, "d3d11.lib") +#include "Device.h" using namespace Microsoft::WRL; -/// -/// Thraed safe self created ID3D11Device from specified adapter -/// -class IsolatedD3D11Device -{ - ComPtr m_device; - ComPtr m_copyTarget; - -public: - ComPtr GetDevice()const { return m_device; } - - bool CreateDevice(const ComPtr &adapter) - { - UINT flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT // D2D Compatible - //| D3D11_CREATE_DEVICE_SINGLETHREADED - //| D3D11_CREATE_DEVICE_VIDEO_SUPPORT // MediaFoundation - ; - - D3D_FEATURE_LEVEL FeatureLevelsRequested[6] = { - D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, - D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_9_3, - D3D_FEATURE_LEVEL_9_2, D3D_FEATURE_LEVEL_9_1 }; - - UINT numLevelsRequested = sizeof(FeatureLevelsRequested) / sizeof(D3D_FEATURE_LEVEL); - D3D_FEATURE_LEVEL FeatureLevelsSupported; - - if (FAILED(D3D11CreateDevice(adapter.Get() - , adapter ? D3D_DRIVER_TYPE_UNKNOWN : D3D_DRIVER_TYPE_HARDWARE, nullptr - , flags - , FeatureLevelsRequested, numLevelsRequested - , D3D11_SDK_VERSION - , &m_device - , &FeatureLevelsSupported - , nullptr - ))) { - return false; - } - return true; - } - - ComPtr CreateCopyTargetWithSharedFlag(const ComPtr &src) - { - D3D11_TEXTURE2D_DESC desc; - src->GetDesc(&desc); - - if (m_copyTarget) { - D3D11_TEXTURE2D_DESC target_desc; - m_copyTarget->GetDesc(&target_desc); - if ( - target_desc.Format == desc.Format - && target_desc.Width == desc.Width - && target_desc.Height == desc.Height - ) { - // already created - return m_copyTarget; - } - } - - //desc.BindFlags |= D3D11_BIND_SHADER_RESOURCE; - desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED; // for share texture with unity device - - if (FAILED(m_device->CreateTexture2D(&desc, NULL, &m_copyTarget))) - { - return nullptr; - } - return m_copyTarget; - } -}; - struct QueueItem { @@ -151,7 +81,9 @@ void Monitor::Initialize( m_pIsolated = std::make_shared(); m_textureQueue = std::make_shared(); - if (!m_pIsolated->CreateDevice(adapter)) { + if (FAILED(m_pIsolated->Create(adapter))) + { + Debug::Error("Monitor::Initialize() => IsolatedD3D11Device::Create() failed."); return; } @@ -535,7 +467,7 @@ void Monitor::DuplicateAndCopyLoop() } // copy target - auto copyTarget = m_pIsolated->CreateCopyTargetWithSharedFlag(texture); + auto copyTarget = m_pIsolated->GetCompatibleSharedTexture(texture); if (!copyTarget) { return; } diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj b/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj index 637e1d4..df33c95 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj @@ -141,6 +141,7 @@ copy /Y "$(SolutionDir)$(Platform)\$(Configuration)\$(TargetName).pdb" "$(Soluti + @@ -149,6 +150,7 @@ copy /Y "$(SolutionDir)$(Platform)\$(Configuration)\$(TargetName).pdb" "$(Soluti + diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj.filters b/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj.filters index 48179e2..eb8cef5 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj.filters +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj.filters @@ -20,6 +20,7 @@ + @@ -28,5 +29,6 @@ + \ No newline at end of file