Wine-devel
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
August 2018
- 62 participants
- 701 discussions
Adapted from document-save-as.svg in the Tango Icon Library.
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/shell32/Makefile.in | 1 +
dlls/shell32/resources/rename.ico | Bin 0 -> 30995 bytes
dlls/shell32/resources/rename.svg | 419 ++++++++++++++++++++++++++++++
dlls/shell32/shell32.rc | 3 +
dlls/shell32/shresdef.h | 1 +
5 files changed, 424 insertions(+)
create mode 100644 dlls/shell32/resources/rename.ico
create mode 100644 dlls/shell32/resources/rename.svg
diff --git a/dlls/shell32/Makefile.in b/dlls/shell32/Makefile.in
index 19e6b5be9e..e2380653e8 100644
--- a/dlls/shell32/Makefile.in
+++ b/dlls/shell32/Makefile.in
@@ -88,6 +88,7 @@ SVG_SRCS = \
resources/printer.svg \
resources/ramdisk.svg \
resources/recent.svg \
+ resources/rename.svg \
resources/search.svg \
resources/shortcut.svg \
resources/shut_down.svg \
diff --git a/dlls/shell32/resources/rename.ico b/dlls/shell32/resources/rename.ico
new file mode 100644
index 0000000000000000000000000000000000000000..2ae1e6242b0155882c869050279f44a09613d62d
GIT binary patch
literal 30995
zcmeI5dsI|K7{I?>7Iqg{SOIyYC1vm9156XK4qB3uL1ua=HP7Or)+s3pNI-E#(9=u)
z(83cM_y7@<hme7a3O-Ir!T}CS%JR_cSf*(O0)pE&yWHz8ATG(aB;R+=cjwOB*?IhC
z?%bKVGj{<5U=2(J;10eP0BLyc;i0pqKL&6a-E?*dq}u^(c*@W|*$cqkz0<!O;KECs
z9sNrHJ_|IoKcfJUqdx&i;B8BQb8j2kUkov{XMP0m$*h3sGV2FeLS=q4rp;!*)`lQL
zqd8h}1r5>Css2*|auaOYgD_ZdSI(I24-oY(a)fGQ544V_e%0KzeAzbOE`HvzbOuzCM$
z&*25(qM6gDfo5I8kB8AF4)gQ(6`z+3v+)`weI!2to#e`(fC%)r9Am|_W71K_TBXfF
zH&4H5Q|Bx{dqwT@>Fck#o(a)m@Kb5rr>KcsviiH-d-de-mZHe-r?YtNRQt(@?R=arOq
zbDV}1`*<lI8EL0n<nsH6S)zc=HzG6U4<A!6_VIeycebuHFnpsV*iAO6wmin?sl3x8
z^D5fURD9;Et`G?R-f&f|9#&O!`dsc0=g%Mg_0OrR7Jd}5Ky$Wq-N$yx{`1F9kM9U9
zO-MKyda5Gp)*f|OWt8XB{x5wS*rbAjPet+oXzV<M9Jv936&VNL@~I#D-TZ{ADa#@8
z;`O%H#gTPUo2?cIcz-iT2z|bMf6qj>h9!m7QE^*xQ{m88H_)zlR5c-RikBeH(PW2n
zmF36OH?w1wUzvAV5b^z2La!&qdnPs}7YIwF?wg?`UZecJepOCkeblDMODtRyt4(a)y`
z|BJQc3DpNe{$L?|V@%onS7)XsXO7FBJgFgCbv<e9((D62ExdfOCOGDL>wBTIKaLpx
z^YM<Ri&fP(a)mz!#W|1O&R+p7F;ghrJV=P9CUgktEp=N8UTwV=~uVZLvK1qX#K_Evtl
z7!4Tb;psKn!)x(a)oiE}(BdQW)Pd;Iv(9?yDvc(gCrdeh(s%ia%uXG!FpfAEFCZ90q8
z&o^LN)(eW*C-EFBKPXVy&90S4bp{=Y01+SpM1Tko0U|&IhyW2F0`~&}l}cs3diCn)
zwQJYr#l^*aJAm|SOxvitF^-Rq&)TtL$Bl}L3Qbj2)qv5Gl9F4ov9Z(a)9BO@Jq%LDrP
z6GhX}(a|p&5)#rc;jr{1B_&;piHY&+E&W(`nwy%Mv~gBeR%-4=S)3SGzokDpIr-X(
z6)R>LoBrI~T+O{GrQfg)6aT)|C#pY#yZ+SH)@trW%~5~)`}wtg{rY}u|BZQmVgDgJ
zH8pj>^&gHNJ!(|{AuKG+2Kz}X24Md!$(a6IZ_j4BMg)ie5g-CYfCvx)B0vO)01+(a)J
z0gYC0lG4m(JA*I+;2JaSO=oiPm^;5*{D$ka*h)hbsm{<I+1kfWIe73OsMTtyuC4}r
zuK{b;tbxSDM8G*=z;_0KbG?A`7obom0Ozsc*s)_!R8#~wZvZ%Ug^e3G!kIH?xZubn
z0z`la5CI}^e-f}XO8C5s>;-mr7b)8kpcPvSVK=eq<{})z`IkEg1zki4-ThnX`ImGN
z(a)-GzX^O1FtUitJ?UgGZj`SP+fu0Ggu<poAnx4v!p;KQa9A~1*vaN{L&n`|4;e=$zw
z;xTuAx%g?EI*4yR$~qAs0z`lan1+B+;|8|PT_-e7mGnB!!*O<(VYAu&cNwP2dQCr#
zQ(a)NT>CK3355#Yv4<~F(Uqp9Dga`Biuzg+xmoa&A`1(pBq1wUhpjwD2Y2oM1xFklGa
z+7w&dm-*((l`EH+LNV;1=;-JNd&=;#Wy{34j;1apCFQTItgIGO=&oJ6n%KS~%qM=I
z%uq1D&*QqBYpt!VnoE~18Kuq5%^Iar*{6L)g(a)uLf$YGUX?7-Fzy}V`1mOrjuy=wGc
z(F+$YXy(qH+o$+(|F8xbu+OU*2*qz+{#^ZQYirZ6I$(^pw6thKLqq#i{&%W>cuz=h
zEnEH8ty(a)iY|7B!kXzxF)Yfl(dzD`R-M1%}E%riyX!@^|k59afsp5i7qB0vO)01^0a
z3Fzhvj6XKumts5B0!@9(a)x*H#o&Zpr#Md!M25!@ENb>D2wH};=k=gysQ;J^XEz8|Ee
zrNRFF`(gL)-Eic{5x_m)aN@)X$jr=y!-o$;P*4zrhllg)!jB(64%@eHhtkqg$jQlp
z`uck9`tX{X8i<ODf|DmtLUwjG)Ya7i?$xGs;<rnJ&WHdJ7`z1JLKj|Swk{8H;?mh_
ziyyM#MP@&oU*YTQpkpR-vgX8Us9jIj9p#)1v-~&LtvIphDSWZ(1DrSs-MWXbpFio4
z?)e+MB|iXi-q(Ib!|i^GxTo{JhDZIB0Z<7j2}FPh5P{wa=s(A)pVB)ky4ueK`r5B(
zFhM_sE%R_kWq&rL6}>qWbmRr!HE8$I<GVh7UZuRe9P;z?p}4qMJFik!R;Ha-!S(a)z$
z>eMM{Y;1(Rd-rPRRtgFV0N*J9zSo0o+qS{Jef#)%ll1g-J{~$D0z_bt5pWRUSl(u+
zy%mo6W%zGu_O_O;uC4+{J7;HSwiVc3>gwp|=)~I{T-aJ=TQTR~#JDv0Me3eZh3%uh
z_T-1TvGL%&wzK+eY+hcTK|9Olu37uazGc$T(4cK+4;?y0ZLNvx1qDw8{#OJXM2`5a
z24}gIR4QfdtlSoN(YOhmhTvSS5I-O#m$<pPISu9Q4z4z0vDn_4^KatJ-l_f6Z)4f{
Xo%~TdYvKZ;;E4bcxI2OSyq*0AOMiay
literal 0
HcmV?d00001
diff --git a/dlls/shell32/resources/rename.svg b/dlls/shell32/resources/rename.svg
new file mode 100644
index 0000000000..a11f8a1c8d
--- /dev/null
+++ b/dlls/shell32/resources/rename.svg
@@ -0,0 +1,419 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ width="632"
+ height="272"
+ id="svg2913">
+ <defs
+ id="defs3">
+ <linearGradient
+ id="linearGradient6965">
+ <stop
+ id="stop6967"
+ offset="0"
+ style="stop-color:#dddddd;stop-opacity:1;" />
+ <stop
+ id="stop6969"
+ offset="1"
+ style="stop-color:#fdfdfd;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="36.437492"
+ x2="28.061466"
+ y1="31.431349"
+ x1="28.061466"
+ id="linearGradient6971"
+ xlink:href="#linearGradient6965" />
+ <linearGradient
+ gradientTransform="translate(-8.8985062e-6)"
+ y2="36.437492"
+ x2="28.061466"
+ y1="31.431349"
+ x1="28.061466"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1026"
+ xlink:href="#linearGradient6965" />
+ <linearGradient
+ gradientTransform="translate(-1.5156709e-5,3.8826737e-6)"
+ y2="36.437492"
+ x2="28.061466"
+ y1="31.431349"
+ x1="28.061466"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1026-0"
+ xlink:href="#linearGradient6965" />
+ </defs>
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>hdd</rdf:li>
+ <rdf:li>hard drive</rdf:li>
+ <rdf:li>save as</rdf:li>
+ <rdf:li>io</rdf:li>
+ <rdf:li>store</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
+ <dc:identifier />
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <rect
+ ry="1.6249995"
+ rx="1.6249996"
+ y="101.09085"
+ x="30.174999"
+ height="69.817146"
+ width="213.65556"
+ id="rect6951"
+ style="color:#000000;display:block;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient6971);fill-opacity:1;fill-rule:nonzero;stroke:#7d7d7d;stroke-width:0.99999976;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none" />
+ <rect
+ ry="0"
+ y="116.45295"
+ x="43.438541"
+ height="39.803806"
+ width="87.099823"
+ id="rect6953"
+ style="color:#000000;display:block;overflow:visible;visibility:visible;opacity:0.59659095;fill:#7d7d7d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none" />
+ <rect
+ y="110.76669"
+ x="135.9821"
+ height="51.176323"
+ width="5.4437389"
+ id="rect6957"
+ style="color:#000000;display:block;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none" />
+ <rect
+ id="icon:256-32"
+ height="256"
+ width="256"
+ y="8"
+ x="8"
+ style="fill:none" />
+ <rect
+ ry="1.6249996"
+ rx="1.6249996"
+ y="237.86078"
+ x="276.564"
+ height="12.278223"
+ width="39.247944"
+ id="rect6951-1"
+ style="color:#000000;display:block;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient1026);fill-opacity:1;fill-rule:nonzero;stroke:#7d7d7d;stroke-width:0.99999976;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none" />
+ <rect
+ ry="0"
+ y="240.56241"
+ x="279.00049"
+ height="7"
+ width="16"
+ id="rect6953-2"
+ style="color:#000000;display:block;overflow:visible;visibility:visible;opacity:0.59659095;fill:#7d7d7d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none" />
+ <rect
+ y="239.56241"
+ x="296.00046"
+ height="9"
+ width="1"
+ id="rect6957-7"
+ style="color:#000000;display:block;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none" />
+ <rect
+ id="icon:48-32"
+ height="48"
+ width="48"
+ y="220"
+ x="272"
+ style="fill:none" />
+ <image
+ width="48"
+ height="48"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,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
+"
+ id="icon:48-8"
+ x="328"
+ y="220" />
+ <image
+ width="48"
+ height="48"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,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
+"
+ id="icon:48-4"
+ x="384"
+ y="220" />
+ <rect
+ ry="1.6249995"
+ rx="1.6249998"
+ y="248.07381"
+ x="443.20901"
+ height="7.8521929"
+ width="25.832096"
+ id="rect6951-1-6"
+ style="color:#000000;display:block;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient1026-0);fill-opacity:1;fill-rule:nonzero;stroke:#7d7d7d;stroke-width:0.99999976;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none" />
+ <rect
+ ry="0"
+ y="249.80159"
+ x="444.81265"
+ height="4.4766536"
+ width="10.530833"
+ id="rect6953-2-0"
+ style="color:#000000;display:block;overflow:visible;visibility:visible;opacity:0.59659095;fill:#7d7d7d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none" />
+ <rect
+ y="249.16206"
+ x="456.00165"
+ height="5.7556973"
+ width="0.65817708"
+ id="rect6957-7-6"
+ style="color:#000000;display:block;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none" />
+ <rect
+ id="icon:32-32"
+ height="32"
+ width="32"
+ y="236"
+ x="440"
+ style="fill:none" />
+ <image
+ width="32"
+ height="32"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,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
+"
+ id="icon:32-8"
+ x="480"
+ y="236" />
+ <image
+ width="32"
+ height="32"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,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
+"
+ id="icon:32-4"
+ x="520"
+ y="236" />
+ <image
+ width="16"
+ height="16"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAQAAADlauupAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
+AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZ
+cwAAJYAAACWAAWxVCAcAAAAHdElNRQfiCBsLKiB4YIh3AAABMUlEQVQ4y+3SMUjUcRQH8M//7m93
+pEScQ4aDODkbDjmEQ3trmwQaIoi4NUlDONbskA4GOTS0SjQ0FbkoOIvcYFHCoZ53at3dc/AH3iC0
+RUNfePD4vu+D9/3y+I/sbYGf29x6QaGGb3/YKBMjnGwyt0t++p7OMe2bxHPsJWEb/Zik08KdxJeI
++7QX2B8mi+DdaMTdeTqrGEnCZc7G+f2LwSnia+Jz4ojqNCtbWZZD+ZDTNWo1sg9JuMN5H6U3VB7S
+fnnlIoY4mKH3FQXQIZ4QQeSpEI9QRXZdepeVw9kEtz8xUMFomj+guU9rjNoSsd5loU5zhsYS2esN
+6t/pK1Nc7AoxIz4Sx8QCKom/QTyleY/HdfLyMI0qxS8UhtDTdebsVfIaqW8Rnyk+Y+DHX3+7fxIX
+l+pi+sKnBHEAAAAUdEVYdEF1dGhvcgBKYWt1YiBTdGVpbmVy5vv3LwAAAFh0RVh0Q29weXJpZ2h0
+AENDMCBQdWJsaWMgRG9tYWluIERlZGljYXRpb24gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcv
+cHVibGljZG9tYWluL3plcm8vMS4wL8bjvfkAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTgtMDgtMjdU
+MTc6NDI6MzItMDY6MDBdLOJiAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE4LTA4LTI3VDE3OjQyOjMy
+LTA2OjAwLHFa3gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAAhdEVYdFNv
+dXJjZQBodHRwOi8vamltbWFjLm11c2ljaGFsbC5jemlm414AAAAASUVORK5CYII=
+"
+ id="icon:16-32"
+ x="560"
+ y="252" />
+ <image
+ width="16"
+ height="16"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
+AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZ
+cwAAJYAAACWAAWxVCAcAAAAHdElNRQfiCBsLKiEPZ7jhAAAAh0lEQVQoz8XRwQoBURjF8d81t0aR
+skJ5Ly/hkVhaeSplN8WCGSaNa0FjEmtndeqczr+vj/8rbBRGel+i5GwpXt01Uie4t4XGXki2aaYR
+wMXN/FVPdtYhkrs4PHlqufFrIykMxKdN7eynIrWxSQdxbBGVUlg5Gco6G29XWYh9pezHmZnpv98A
+Hi+eLw8bGCqAAAAAFHRFWHRBdXRob3IASmFrdWIgU3RlaW5lcub79y8AAABYdEVYdENvcHlyaWdo
+dABDQzAgUHVibGljIERvbWFpbiBEZWRpY2F0aW9uIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3Jn
+L3B1YmxpY2RvbWFpbi96ZXJvLzEuMC/G4735AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE4LTA4LTI3
+VDE3OjQyOjMzLTA2OjAw+1vp1gAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxOC0wOC0yN1QxNzo0Mjoz
+My0wNjowMIoGUWoAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAIXRFWHRT
+b3VyY2UAaHR0cDovL2ppbW1hYy5tdXNpY2hhbGwuY3ppZuNeAAAAAElFTkSuQmCC
+"
+ id="icon:16-8"
+ x="584"
+ y="252" />
+ <image
+ width="16"
+ height="16"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
+AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZ
+cwAAJYAAACWAAWxVCAcAAAAHdElNRQfiCBsLKiEPZ7jhAAAAh0lEQVQoz8XRwQoBURjF8d81t0aR
+skJ5Ly/hkVhaeSplN8WCGSaNa0FjEmtndeqczr+vj/8rbBRGel+i5GwpXt01Uie4t4XGXki2aaYR
+wMXN/FVPdtYhkrs4PHlqufFrIykMxKdN7eynIrWxSQdxbBGVUlg5Gco6G29XWYh9pezHmZnpv98A
+Hi+eLw8bGCqAAAAAFHRFWHRBdXRob3IASmFrdWIgU3RlaW5lcub79y8AAABYdEVYdENvcHlyaWdo
+dABDQzAgUHVibGljIERvbWFpbiBEZWRpY2F0aW9uIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3Jn
+L3B1YmxpY2RvbWFpbi96ZXJvLzEuMC/G4735AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE4LTA4LTI3
+VDE3OjQyOjMzLTA2OjAw+1vp1gAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxOC0wOC0yN1QxNzo0Mjoz
+My0wNjowMIoGUWoAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAIXRFWHRT
+b3VyY2UAaHR0cDovL2ppbW1hYy5tdXNpY2hhbGwuY3ppZuNeAAAAAElFTkSuQmCC
+"
+ id="icon:16-4"
+ x="608"
+ y="252" />
+</svg>
diff --git a/dlls/shell32/shell32.rc b/dlls/shell32/shell32.rc
index 169d345786..b6043cf3d6 100644
--- a/dlls/shell32/shell32.rc
+++ b/dlls/shell32/shell32.rc
@@ -645,6 +645,9 @@ IDI_SHELL_FAVORITES_FOLDER ICON resources/favorites.ico
/* @makedep: resources/mydocs.ico */
IDI_SHELL_MY_DOCUMENTS ICON resources/mydocs.ico
+/* @makedep: resources/rename.ico */
+IDI_SHELL_RENAME ICON resources/rename.ico
+
/* @makedep: resources/optical_disc.ico */
IDI_SHELL_OPTICAL_DISC ICON resources/optical_disc.ico
diff --git a/dlls/shell32/shresdef.h b/dlls/shell32/shresdef.h
index 81f41fcc43..042991c065 100644
--- a/dlls/shell32/shresdef.h
+++ b/dlls/shell32/shresdef.h
@@ -244,6 +244,7 @@
#define IDI_SHELL_DEFAULT_TO_FILE_PRINTER 170
#define IDI_SHELL_FAVORITES_FOLDER 173
#define IDI_SHELL_MY_DOCUMENTS 235
+#define IDI_SHELL_RENAME 242
#define IDI_SHELL_OPTICAL_DISC 302
#define IDI_SHELL_FAVORITES_SMALL 322
--
2.18.0
1
18
27 Aug '18
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/dpnet/client.c | 14 +++++++++++---
dlls/dpnet/tests/client.c | 30 ++++++++++++++++++++++++++++++
2 files changed, 41 insertions(+), 3 deletions(-)
diff --git a/dlls/dpnet/client.c b/dlls/dpnet/client.c
index 3b3361f..ea491ef 100644
--- a/dlls/dpnet/client.c
+++ b/dlls/dpnet/client.c
@@ -309,9 +309,17 @@ static HRESULT WINAPI IDirectPlay8ClientImpl_SetCaps(IDirectPlay8Client *iface,
static HRESULT WINAPI IDirectPlay8ClientImpl_SetSPCaps(IDirectPlay8Client *iface,
const GUID * const pguidSP, const DPN_SP_CAPS * const pdpspCaps, const DWORD dwFlags)
{
- IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
- FIXME("(%p):(%x): Stub\n", This, dwFlags);
- return DPN_OK;
+ IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
+
+ TRACE("(%p)->(%p,%p,%x): stub\n", iface, pguidSP, pdpspCaps, dwFlags);
+
+ if(!This->msghandler || pdpspCaps->dwSize != sizeof(DPN_SP_CAPS))
+ return DPNERR_INVALIDPARAM;
+
+ /* Only dwSystemBufferSize is set by this call. */
+ This->spcaps.dwSystemBufferSize = pdpspCaps->dwSystemBufferSize;
+
+ return DPN_OK;
}
static HRESULT WINAPI IDirectPlay8ClientImpl_GetSPCaps(IDirectPlay8Client *iface,
diff --git a/dlls/dpnet/tests/client.c b/dlls/dpnet/tests/client.c
index 47d8b01..af56d85 100644
--- a/dlls/dpnet/tests/client.c
+++ b/dlls/dpnet/tests/client.c
@@ -140,6 +140,9 @@ static BOOL test_init_dp(void)
hr = IDirectPlay8Client_Initialize(client, NULL, NULL, 0);
ok(hr == DPNERR_INVALIDPARAM, "got %x\n", hr);
+ hr = IDirectPlay8Client_SetSPCaps(client, &CLSID_DP8SP_TCPIP, &caps, 0);
+ ok(hr == DPNERR_INVALIDPARAM, "SetSPCaps failed with %x\n", hr);
+
hr = IDirectPlay8Client_Initialize(client, NULL, DirectPlayMessageHandler, 0);
ok(hr == S_OK, "IDirectPlay8Client_Initialize failed with %x\n", hr);
@@ -415,6 +418,33 @@ static void test_get_sp_caps(void)
ok(caps.dwBuffersPerThread == 1, "expected 1, got %d\n", caps.dwBuffersPerThread);
ok(caps.dwSystemBufferSize == 0x10000 || broken(caps.dwSystemBufferSize == 0x2000 /* before Win8 */),
"expected 0x10000, got 0x%x\n", caps.dwSystemBufferSize);
+
+ caps.dwNumThreads = 2;
+ caps.dwDefaultEnumCount = 3;
+ caps.dwDefaultEnumRetryInterval = 1400;
+ caps.dwDefaultEnumTimeout = 1400;
+ caps.dwMaxEnumPayloadSize = 900;
+ caps.dwBuffersPerThread = 2;
+ caps.dwSystemBufferSize = 0x0ffff;
+ hr = IDirectPlay8Client_SetSPCaps(client, &CLSID_DP8SP_TCPIP, &caps, 0);
+ ok(hr == DPN_OK, "SetSPCaps failed with %x\n", hr);
+
+ hr = IDirectPlay8Client_GetSPCaps(client, &CLSID_DP8SP_TCPIP, &caps, 0);
+ ok(hr == DPN_OK, "GetSPCaps failed with %x\n", hr);
+
+ ok(caps.dwSize == sizeof(DPN_SP_CAPS), "got %d\n", caps.dwSize);
+ ok(caps.dwNumThreads >= 3, "got %d\n", caps.dwNumThreads);
+ ok(caps.dwDefaultEnumCount == 5, "expected 5, got %d\n", caps.dwDefaultEnumCount);
+ ok(caps.dwDefaultEnumRetryInterval == 1500, "expected 1500, got %d\n", caps.dwDefaultEnumRetryInterval);
+ ok(caps.dwDefaultEnumTimeout == 1500, "expected 1500, got %d\n", caps.dwDefaultEnumTimeout);
+ ok(caps.dwMaxEnumPayloadSize == 983, "expected 983, got %d\n", caps.dwMaxEnumPayloadSize);
+ ok(caps.dwBuffersPerThread == 1, "expected 1, got %d\n", caps.dwBuffersPerThread);
+ ok(caps.dwSystemBufferSize == 0x0ffff, "expected 0x0ffff, got 0x%x\n", caps.dwSystemBufferSize);
+
+ /* Reset the System setting back to its default. */
+ caps.dwSystemBufferSize = 0x10000;
+ hr = IDirectPlay8Client_SetSPCaps(client, &CLSID_DP8SP_TCPIP, &caps, 0);
+ ok(hr == DPN_OK, "SetSPCaps failed with %x\n", hr);
}
static void test_lobbyclient(void)
--
1.9.1
1
0
[PATCH 1/5] [programs/cmd] REBASE+RESEND: Fix shortpath handling in for loops
by Jason Edmeades 27 Aug '18
by Jason Edmeades 27 Aug '18
27 Aug '18
Fixes todo in tests
When 's' is used as a modifier, the paths that are presented to the other modifiers needs to be
a short path. Given the 'filename' part of the path may not exist, we cannot use GetShortPathName
directly without first removing the filename part to just leave the directory bit.
Signed-off-by: Jason Edmeades <us(a)edmeades.me.uk>
---
programs/cmd/batch.c | 17 +++++++++++++----
programs/cmd/tests/test_builtins.cmd.exp | 12 ++++++------
2 files changed, 19 insertions(+), 10 deletions(-)
diff --git a/programs/cmd/batch.c b/programs/cmd/batch.c
index 14e2539bf7..1ed5197adc 100644
--- a/programs/cmd/batch.c
+++ b/programs/cmd/batch.c
@@ -399,6 +399,7 @@ void WCMD_HandleTildaModifiers(WCHAR **start, BOOL atExecute)
WCHAR finaloutput[MAX_PATH];
WCHAR fullfilename[MAX_PATH];
WCHAR thisoutput[MAX_PATH];
+ WCHAR *filepart = NULL;
WCHAR *pos = *start+1;
WCHAR *firstModifier = pos;
WCHAR *lastModifier = NULL;
@@ -522,7 +523,7 @@ void WCMD_HandleTildaModifiers(WCHAR **start, BOOL atExecute)
/* After this, we need full information on the file,
which is valid not to exist. */
if (!skipFileParsing) {
- if (GetFullPathNameW(outputparam, MAX_PATH, fullfilename, NULL) == 0) {
+ if (GetFullPathNameW(outputparam, MAX_PATH, fullfilename, &filepart) == 0) {
exists = FALSE;
fullfilename[0] = 0x00;
} else {
@@ -598,8 +599,16 @@ void WCMD_HandleTildaModifiers(WCHAR **start, BOOL atExecute)
/* 4. Handle 's' : Use short paths (File doesn't have to exist) */
if (memchrW(firstModifier, 's', modifierLen) != NULL) {
if (finaloutput[0] != 0x00) strcatW(finaloutput, spaceW);
- /* Don't flag as doneModifier - %~s on its own is processed later */
- GetShortPathNameW(outputparam, outputparam, ARRAY_SIZE(outputparam));
+
+ /* Convert fullfilename's path to a short path - Save filename away as
+ only path is valid, name may not exist which causes GetShortPathName
+ to fail if it is provided */
+ if (filepart) {
+ strcpyW(thisoutput, filepart);
+ *filepart = 0x00;
+ GetShortPathNameW(fullfilename, fullfilename, ARRAY_SIZE(fullfilename));
+ strcatW(fullfilename, thisoutput);
+ }
}
/* 5. Handle 'f' : Fully qualified path (File doesn't have to exist) */
@@ -673,7 +682,7 @@ void WCMD_HandleTildaModifiers(WCHAR **start, BOOL atExecute)
memchrW(firstModifier, 's', modifierLen) != NULL) {
doneModifier = TRUE;
if (finaloutput[0] != 0x00) strcatW(finaloutput, spaceW);
- strcatW(finaloutput, outputparam);
+ strcatW(finaloutput, fullfilename);
}
}
}
diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp
index ea4157c09d..35e0cf2fa5 100644
--- a/programs/cmd/tests/test_builtins.cmd.exp
+++ b/programs/cmd/tests/test_builtins.cmd.exp
@@ -530,9 +530,9 @@ N
'.OOL'
'.TABC'
''
-(a)todo_wine@'@drive@@shortpath(a)R S'@or_broken@''
-(a)todo_wine@'@drive@@shortpath(a)T'@or_broken@''
-(a)todo_wine@'@drive@@shortpath(a)ABCDEFGHIJK.LMNOP'@or_broken@''
+'@drive@@shortpath(a)R S'@or_broken@''
+'@drive@@shortpath(a)T'@or_broken@''
+'@drive@@shortpath(a)ABCDEFGHIJK.LMNOP'@or_broken@''
''@or_broken@'%~ai'
''@or_broken@'%~ai'
'--a------'@or_broken@'--a--------'@or_broken@'--a--c---'@or_broken@'%~ai'
@@ -566,9 +566,9 @@ N
'.OOL'
'.TABC'
''
-(a)todo_wine@'@drive@@shortpath(a)R S'@or_broken@''
-(a)todo_wine@'@drive@@shortpath(a)T'@or_broken@''
-(a)todo_wine@'@drive@@shortpath(a)ABCDEFGHIJK.LMNOP'@or_broken@''
+'@drive@@shortpath(a)R S'@or_broken@''
+'@drive@@shortpath(a)T'@or_broken@''
+'@drive@@shortpath(a)ABCDEFGHIJK.LMNOP'@or_broken@''
@drive@@path@
@drive@@path@
@drive@
--
2.17.1
1
4
27 Aug '18
Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com>
---
The main point here is that calling SetFullscreenState with the state
that is already set succeeds, even if the window is destroyed. Unreal
Engine 4 games depend on this, and Wine already passes this test.
The code changes are for the failure case, when trying to change the
state on a destroyed window. I don't have a game that depends on
this, so if you'd prefer a todo_wine and no code changes, I'm fine
with that, too.
dlls/dxgi/swapchain.c | 2 ++
dlls/dxgi/tests/dxgi.c | 6 +++++-
dlls/wined3d/swapchain.c | 10 ++++++++++
3 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 83e0f25674..ac40eb78f6 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -254,6 +254,8 @@ static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_SetFullscreen
swapchain->target = target;
return S_OK;
}
+ else
+ hr = DXGI_ERROR_NOT_CURRENTLY_AVAILABLE;
if (target)
IDXGIOutput_Release(target);
diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c
index 56065456eb..fc008ccdd7 100644
--- a/dlls/dxgi/tests/dxgi.c
+++ b/dlls/dxgi/tests/dxgi.c
@@ -2162,10 +2162,14 @@ static void test_set_fullscreen(void)
}
hr = IDXGISwapChain_SetFullscreenState(swapchain, FALSE, NULL);
ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+ DestroyWindow(swapchain_desc.OutputWindow);
+ hr = IDXGISwapChain_SetFullscreenState(swapchain, FALSE, NULL);
+ ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+ hr = IDXGISwapChain_SetFullscreenState(swapchain, TRUE, NULL);
+ ok(hr == DXGI_ERROR_NOT_CURRENTLY_AVAILABLE, "Got unexpected hr %#x.\n", hr);
refcount = IDXGISwapChain_Release(swapchain);
ok(!refcount, "IDXGISwapChain has %u references left.\n", refcount);
- DestroyWindow(swapchain_desc.OutputWindow);
swapchain_desc.OutputWindow = CreateWindowA("static", "dxgi_test", 0, 0, 0, 400, 200, 0, 0, 0, 0);
check_window_fullscreen_state(swapchain_desc.OutputWindow, &initial_state.fullscreen_state);
hr = IDXGIFactory_CreateSwapChain(factory, (IUnknown *)device, &swapchain_desc, &swapchain);
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 8200bdd5e0..a51027267e 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -1408,6 +1408,9 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha
return hr;
}
+ if (!IsWindow(swapchain->device_window))
+ return WINED3DERR_NOTAVAILABLE;
+
wined3d_device_setup_fullscreen_window(device, swapchain->device_window, width, height);
}
else
@@ -1416,6 +1419,9 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha
BOOL filter_messages = device->filter_messages;
device->filter_messages = TRUE;
+ if (!IsWindow(swapchain->device_window))
+ return WINED3DERR_NOTAVAILABLE;
+
MoveWindow(swapchain->device_window, 0, 0, width, height, TRUE);
ShowWindow(swapchain->device_window, SW_SHOW);
@@ -1427,6 +1433,10 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha
{
/* Fullscreen -> windowed switch */
RECT *window_rect = NULL;
+
+ if (!IsWindow(swapchain->device_window))
+ return WINED3DERR_NOTAVAILABLE;
+
if (swapchain->desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
window_rect = &swapchain->original_window_rect;
wined3d_device_restore_fullscreen_window(device, swapchain->device_window, window_rect);
--
2.18.0
1
0
27 Aug '18
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d/resource.c | 237 +++++++++++++++++++++++++++-----------------------
1 file changed, 126 insertions(+), 111 deletions(-)
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index f6dffbfda31e..d4d1b38f7496 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -1274,12 +1274,66 @@ static void vkd3d_set_view_swizzle_for_format(VkComponentMapping *components,
}
}
+enum vkd3d_view_kind
+{
+ VKD3D_VIEW_TYPE_DSV,
+ VKD3D_VIEW_TYPE_RTV,
+ VKD3D_VIEW_TYPE_SRV,
+ VKD3D_VIEW_TYPE_UAV,
+};
+
+struct vkd3d_texture_view_desc
+{
+ enum vkd3d_view_kind view_kind;
+ VkImageViewType view_type;
+ const struct vkd3d_format *format;
+ unsigned int miplevel_idx;
+ unsigned int miplevel_count;
+ unsigned int layer_idx;
+ unsigned int layer_count;
+ bool allowed_swizzle;
+};
+
+static bool init_default_texture_view_desc(struct vkd3d_texture_view_desc *desc,
+ struct d3d12_resource *resource, DXGI_FORMAT view_format, enum vkd3d_view_kind view_kind)
+{
+ bool is_srv = view_kind == VKD3D_VIEW_TYPE_SRV;
+
+ desc->view_kind = view_kind;
+
+ if (!(desc->format = vkd3d_format_from_d3d12_resource_desc(&resource->desc, view_format)))
+ {
+ FIXME("Failed to find format (resource format %#x, view format %#x).\n",
+ resource->desc.Format, view_format);
+ return false;
+ }
+
+ switch (resource->desc.Dimension)
+ {
+ case D3D12_RESOURCE_DIMENSION_TEXTURE2D:
+ desc->view_type = resource->desc.DepthOrArraySize > 1
+ ? VK_IMAGE_VIEW_TYPE_2D_ARRAY : VK_IMAGE_VIEW_TYPE_2D;
+ desc->miplevel_idx = 0;
+ desc->miplevel_count = is_srv ? VK_REMAINING_MIP_LEVELS : 1;
+ desc->layer_idx = 0;
+ desc->layer_count = VK_REMAINING_ARRAY_LAYERS;
+ break;
+
+ default:
+ FIXME("Resource dimension %#x not implemented.\n", resource->desc.Dimension);
+ return false;
+ }
+
+ desc->allowed_swizzle = is_srv;
+ return true;
+}
+
static VkResult vkd3d_create_texture_view(struct d3d12_device *device,
- struct d3d12_resource *resource, const struct vkd3d_format *format, VkImageViewType view_type,
- uint32_t miplevel_idx, uint32_t miplevel_count, uint32_t layer_idx, uint32_t layer_count,
- bool allowed_swizzle, VkImageView *vk_view)
+ struct d3d12_resource *resource, const struct vkd3d_texture_view_desc *desc,
+ VkImageView *vk_view)
{
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
+ const struct vkd3d_format *format = desc->format;
struct VkImageViewCreateInfo view_desc;
VkResult vr;
@@ -1289,14 +1343,14 @@ static VkResult vkd3d_create_texture_view(struct d3d12_device *device,
view_desc.pNext = NULL;
view_desc.flags = 0;
view_desc.image = resource->u.vk_image;
- view_desc.viewType = view_type;
+ view_desc.viewType = desc->view_type;
view_desc.format = format->vk_format;
- vkd3d_set_view_swizzle_for_format(&view_desc.components, format, allowed_swizzle);
+ vkd3d_set_view_swizzle_for_format(&view_desc.components, format, desc->allowed_swizzle);
view_desc.subresourceRange.aspectMask = format->vk_aspect_mask;
- view_desc.subresourceRange.baseMipLevel = miplevel_idx;
- view_desc.subresourceRange.levelCount = miplevel_count;
- view_desc.subresourceRange.baseArrayLayer = layer_idx;
- view_desc.subresourceRange.layerCount = layer_count;
+ view_desc.subresourceRange.baseMipLevel = desc->miplevel_idx;
+ view_desc.subresourceRange.levelCount = desc->miplevel_count;
+ view_desc.subresourceRange.baseArrayLayer = desc->layer_idx;
+ view_desc.subresourceRange.layerCount = desc->layer_count;
if ((vr = VK_CALL(vkCreateImageView(device->vk_device, &view_desc, NULL, vk_view))) < 0)
WARN("Failed to create Vulkan image view, vr %d.\n", vr);
return vr;
@@ -1387,9 +1441,7 @@ void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
struct d3d12_device *device, struct d3d12_resource *resource,
const D3D12_SHADER_RESOURCE_VIEW_DESC *desc)
{
- uint32_t miplevel_idx, miplevel_count, layer_idx, layer_count;
- const struct vkd3d_format *format;
- VkImageViewType vk_view_type;
+ struct vkd3d_texture_view_desc vkd3d_desc;
struct vkd3d_view *view;
d3d12_desc_destroy(descriptor, device);
@@ -1406,24 +1458,9 @@ void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
return;
}
- if (resource->desc.Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE2D)
- {
- FIXME("Resource dimension %#x not implemented.\n", resource->desc.Dimension);
- return;
- }
-
- if (!(format = vkd3d_format_from_d3d12_resource_desc(&resource->desc, desc ? desc->Format : 0)))
- {
- FIXME("Failed to find format for %#x.\n", resource->desc.Format);
+ if (!init_default_texture_view_desc(&vkd3d_desc, resource, desc ? desc->Format : 0, VKD3D_VIEW_TYPE_SRV))
return;
- }
- vk_view_type = resource->desc.DepthOrArraySize > 1
- ? VK_IMAGE_VIEW_TYPE_2D_ARRAY : VK_IMAGE_VIEW_TYPE_2D;
- miplevel_idx = 0;
- miplevel_count = VK_REMAINING_MIP_LEVELS;
- layer_idx = 0;
- layer_count = VK_REMAINING_ARRAY_LAYERS;
if (desc)
{
if (desc->Shader4ComponentMapping != D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING)
@@ -1432,28 +1469,28 @@ void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
switch (desc->ViewDimension)
{
case D3D12_SRV_DIMENSION_TEXTURE2D:
- vk_view_type = VK_IMAGE_VIEW_TYPE_2D;
- miplevel_idx = desc->u.Texture2D.MostDetailedMip;
- miplevel_count = desc->u.Texture2D.MipLevels;
+ vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D;
+ vkd3d_desc.miplevel_idx = desc->u.Texture2D.MostDetailedMip;
+ vkd3d_desc.miplevel_count = desc->u.Texture2D.MipLevels;
if (desc->u.Texture2D.PlaneSlice)
FIXME("Ignoring plane slice %u.\n", desc->u.Texture2D.PlaneSlice);
if (desc->u.Texture2D.ResourceMinLODClamp)
FIXME("Unhandled min LOD clamp %.8e.\n", desc->u.Texture2D.ResourceMinLODClamp);
break;
case D3D12_SRV_DIMENSION_TEXTURECUBE:
- vk_view_type = VK_IMAGE_VIEW_TYPE_CUBE;
- miplevel_idx = desc->u.TextureCube.MostDetailedMip;
- miplevel_count = desc->u.TextureCube.MipLevels;
- layer_count = 6;
+ vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_CUBE;
+ vkd3d_desc.miplevel_idx = desc->u.TextureCube.MostDetailedMip;
+ vkd3d_desc.miplevel_count = desc->u.TextureCube.MipLevels;
+ vkd3d_desc.layer_count = 6;
if (desc->u.TextureCube.ResourceMinLODClamp)
FIXME("Unhandled min LOD clamp %.8e.\n", desc->u.TextureCube.ResourceMinLODClamp);
break;
case D3D12_SRV_DIMENSION_TEXTURECUBEARRAY:
- vk_view_type = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
- miplevel_idx = desc->u.TextureCubeArray.MostDetailedMip;
- miplevel_count = desc->u.TextureCubeArray.MipLevels;
- layer_idx = desc->u.TextureCubeArray.First2DArrayFace;
- layer_count = 6 * desc->u.TextureCubeArray.NumCubes;
+ vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
+ vkd3d_desc.miplevel_idx = desc->u.TextureCubeArray.MostDetailedMip;
+ vkd3d_desc.miplevel_count = desc->u.TextureCubeArray.MipLevels;
+ vkd3d_desc.layer_idx = desc->u.TextureCubeArray.First2DArrayFace;
+ vkd3d_desc.layer_count = 6 * desc->u.TextureCubeArray.NumCubes;
if (desc->u.TextureCubeArray.ResourceMinLODClamp)
FIXME("Unhandled min LOD clamp %.8e.\n", desc->u.TextureCubeArray.ResourceMinLODClamp);
break;
@@ -1465,8 +1502,7 @@ void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
if (!(view = vkd3d_view_create()))
return;
- if (vkd3d_create_texture_view(device, resource, format, vk_view_type,
- miplevel_idx, miplevel_count, layer_idx, layer_count, true, &view->u.vk_image_view) < 0)
+ if (vkd3d_create_texture_view(device, resource, &vkd3d_desc, &view->u.vk_image_view) < 0)
{
vkd3d_free(view);
return;
@@ -1551,34 +1587,18 @@ static void vkd3d_create_texture_uav(struct d3d12_desc *descriptor,
struct d3d12_device *device, struct d3d12_resource *resource,
const D3D12_UNORDERED_ACCESS_VIEW_DESC *desc)
{
- uint32_t miplevel_idx, layer_idx, layer_count;
- const struct vkd3d_format *format;
- VkImageViewType vk_view_type;
+ struct vkd3d_texture_view_desc vkd3d_desc;
struct vkd3d_view *view;
- if (resource->desc.Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE2D)
- {
- FIXME("Resource dimension %#x not implemented.\n", resource->desc.Dimension);
+ if (!init_default_texture_view_desc(&vkd3d_desc, resource, desc ? desc->Format : 0, VKD3D_VIEW_TYPE_UAV))
return;
- }
- if (!(format = vkd3d_format_from_d3d12_resource_desc(&resource->desc, desc ? desc->Format : 0)))
- {
- ERR("Failed to find format for %#x.\n", resource->desc.Format);
- return;
- }
-
- if (vkd3d_format_is_compressed(format))
+ if (vkd3d_format_is_compressed(vkd3d_desc.format))
{
WARN("UAVs cannot be created for compressed formats.\n");
return;
}
- vk_view_type = resource->desc.DepthOrArraySize > 1
- ? VK_IMAGE_VIEW_TYPE_2D_ARRAY : VK_IMAGE_VIEW_TYPE_2D;
- miplevel_idx = 0;
- layer_idx = 0;
- layer_count = VK_REMAINING_ARRAY_LAYERS;
if (desc)
{
if (desc->ViewDimension == D3D12_UAV_DIMENSION_TEXTURE2D)
@@ -1586,17 +1606,17 @@ static void vkd3d_create_texture_uav(struct d3d12_desc *descriptor,
if (desc->u.Texture2D.PlaneSlice)
FIXME("Ignoring plane slice %u.\n", desc->u.Texture2D.PlaneSlice);
- miplevel_idx = desc->u.Texture2D.MipSlice;
+ vkd3d_desc.miplevel_idx = desc->u.Texture2D.MipSlice;
}
else if (desc->ViewDimension == D3D12_UAV_DIMENSION_TEXTURE2DARRAY)
{
if (desc->u.Texture2DArray.PlaneSlice)
FIXME("Ignoring plane slice %u.\n", desc->u.Texture2DArray.PlaneSlice);
- vk_view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
- miplevel_idx = desc->u.Texture2DArray.MipSlice;
- layer_idx = desc->u.Texture2DArray.FirstArraySlice;
- layer_count = desc->u.Texture2DArray.ArraySize;
+ vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
+ vkd3d_desc.miplevel_idx = desc->u.Texture2DArray.MipSlice;
+ vkd3d_desc.layer_idx = desc->u.Texture2DArray.FirstArraySlice;
+ vkd3d_desc.layer_count = desc->u.Texture2DArray.ArraySize;
}
else
{
@@ -1608,8 +1628,7 @@ static void vkd3d_create_texture_uav(struct d3d12_desc *descriptor,
if (!(view = vkd3d_view_create()))
return;
- if (vkd3d_create_texture_view(device, resource, format, vk_view_type,
- miplevel_idx, 1, layer_idx, layer_count, false, &view->u.vk_image_view) < 0)
+ if (vkd3d_create_texture_view(device, resource, &vkd3d_desc, &view->u.vk_image_view) < 0)
{
vkd3d_free(view);
return;
@@ -1808,10 +1827,8 @@ static void d3d12_rtv_desc_destroy(struct d3d12_rtv_desc *rtv, struct d3d12_devi
void d3d12_rtv_desc_create_rtv(struct d3d12_rtv_desc *rtv_desc, struct d3d12_device *device,
struct d3d12_resource *resource, const D3D12_RENDER_TARGET_VIEW_DESC *desc)
{
- const struct vkd3d_format *format;
- VkImageViewType vk_view_type;
+ struct vkd3d_texture_view_desc vkd3d_desc;
struct vkd3d_view *view;
- uint32_t miplevel_idx;
d3d12_rtv_desc_destroy(rtv_desc, device);
@@ -1821,44 +1838,42 @@ void d3d12_rtv_desc_create_rtv(struct d3d12_rtv_desc *rtv_desc, struct d3d12_dev
return;
}
- if (resource->desc.Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE2D)
- {
- FIXME("Resource dimension %#x not implemented.\n", resource->desc.Dimension);
+ if (!init_default_texture_view_desc(&vkd3d_desc, resource, desc ? desc->Format : 0, VKD3D_VIEW_TYPE_RTV))
return;
- }
- if (!(format = vkd3d_format_from_d3d12_resource_desc(&resource->desc, desc ? desc->Format : 0)))
+ if (vkd3d_desc.format->vk_aspect_mask != VK_IMAGE_ASPECT_COLOR_BIT)
{
- WARN("Invalid DXGI format.\n");
+ WARN("Trying to create RTV for depth/stencil format %#x.\n", vkd3d_desc.format->dxgi_format);
return;
}
- if (format->vk_aspect_mask != VK_IMAGE_ASPECT_COLOR_BIT)
+ if (desc)
{
- WARN("Trying to create RTV for depth/stencil format %#x.\n", format->dxgi_format);
- return;
+ switch (desc->ViewDimension)
+ {
+ case D3D12_RTV_DIMENSION_TEXTURE2D:
+ vkd3d_desc.miplevel_idx = desc->u.Texture2D.MipSlice;
+ if (desc->u.Texture2D.PlaneSlice)
+ FIXME("Ignoring plane slice %u.\n", desc->u.Texture2D.PlaneSlice);
+ break;
+ default:
+ FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension);
+ }
}
- if (desc && desc->u.Texture2D.PlaneSlice)
- FIXME("Ignoring plane slice %u.\n", desc->u.Texture2D.PlaneSlice);
-
if (!(view = vkd3d_view_create()))
return;
- miplevel_idx = desc ? desc->u.Texture2D.MipSlice : 0;
- vk_view_type = resource->desc.DepthOrArraySize > 1
- ? VK_IMAGE_VIEW_TYPE_2D_ARRAY : VK_IMAGE_VIEW_TYPE_2D;
- if (vkd3d_create_texture_view(device, resource, format, vk_view_type,
- miplevel_idx, 1, 0, VK_REMAINING_ARRAY_LAYERS, false, &view->u.vk_image_view) < 0)
+ if (vkd3d_create_texture_view(device, resource, &vkd3d_desc, &view->u.vk_image_view) < 0)
{
vkd3d_free(view);
return;
}
rtv_desc->magic = VKD3D_DESCRIPTOR_MAGIC_RTV;
- rtv_desc->format = format->vk_format;
- rtv_desc->width = d3d12_resource_desc_get_width(&resource->desc, miplevel_idx);
- rtv_desc->height = d3d12_resource_desc_get_height(&resource->desc, miplevel_idx);
+ rtv_desc->format = vkd3d_desc.format->vk_format;
+ rtv_desc->width = d3d12_resource_desc_get_width(&resource->desc, vkd3d_desc.miplevel_idx);
+ rtv_desc->height = d3d12_resource_desc_get_height(&resource->desc, vkd3d_desc.miplevel_idx);
rtv_desc->layer_count = resource->desc.DepthOrArraySize;
rtv_desc->view = view;
rtv_desc->resource = resource;
@@ -1877,9 +1892,8 @@ static void d3d12_dsv_desc_destroy(struct d3d12_dsv_desc *dsv, struct d3d12_devi
void d3d12_dsv_desc_create_dsv(struct d3d12_dsv_desc *dsv_desc, struct d3d12_device *device,
struct d3d12_resource *resource, const D3D12_DEPTH_STENCIL_VIEW_DESC *desc)
{
- const struct vkd3d_format *format;
+ struct vkd3d_texture_view_desc vkd3d_desc;
struct vkd3d_view *view;
- uint32_t miplevel_idx;
d3d12_dsv_desc_destroy(dsv_desc, device);
@@ -1889,39 +1903,40 @@ void d3d12_dsv_desc_create_dsv(struct d3d12_dsv_desc *dsv_desc, struct d3d12_dev
return;
}
- if (resource->desc.Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE2D)
- {
- FIXME("Resource dimension %#x not implemented.\n", resource->desc.Dimension);
+ if (!init_default_texture_view_desc(&vkd3d_desc, resource, desc ? desc->Format : 0, VKD3D_VIEW_TYPE_DSV))
return;
- }
- if (!(format = vkd3d_format_from_d3d12_resource_desc(&resource->desc, desc ? desc->Format : 0)))
+ if (!(vkd3d_desc.format->vk_aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)))
{
- WARN("Invalid DXGI format.\n");
+ WARN("Trying to create DSV for format %#x.\n", vkd3d_desc.format->dxgi_format);
return;
}
- if (!(format->vk_aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)))
+ if (desc)
{
- WARN("Trying to create DSV for format %#x.\n", format->dxgi_format);
- return;
- }
+ if (desc->Flags)
+ FIXME("Ignoring flags %#x.\n", desc->Flags);
- if (desc && desc->Flags)
- FIXME("Ignoring flags %#x.\n", desc->Flags);
+ switch (desc->ViewDimension)
+ {
+ case D3D12_DSV_DIMENSION_TEXTURE2D:
+ vkd3d_desc.miplevel_idx = desc->u.Texture2D.MipSlice;
+ break;
+ default:
+ FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension);
+ }
+ }
if (!(view = vkd3d_view_create()))
return;
- miplevel_idx = desc ? desc->u.Texture2D.MipSlice : 0;
- if (vkd3d_create_texture_view(device, resource, format, VK_IMAGE_VIEW_TYPE_2D,
- miplevel_idx, 1, 0, 1, false, &view->u.vk_image_view) < 0)
+ if (vkd3d_create_texture_view(device, resource, &vkd3d_desc, &view->u.vk_image_view) < 0)
return;
dsv_desc->magic = VKD3D_DESCRIPTOR_MAGIC_DSV;
- dsv_desc->format = format->vk_format;
- dsv_desc->width = d3d12_resource_desc_get_width(&resource->desc, miplevel_idx);
- dsv_desc->height = d3d12_resource_desc_get_height(&resource->desc, miplevel_idx);
+ dsv_desc->format = vkd3d_desc.format->vk_format;
+ dsv_desc->width = d3d12_resource_desc_get_width(&resource->desc, vkd3d_desc.miplevel_idx);
+ dsv_desc->height = d3d12_resource_desc_get_height(&resource->desc, vkd3d_desc.miplevel_idx);
dsv_desc->view = view;
dsv_desc->resource = resource;
}
--
2.16.4
2
1
[PATCH vkd3d 10/10] vkd3d-shader: Downgrade FIXME() about unhandled instruction modifiers to WARN().
by Józef Kucia 27 Aug '18
by Józef Kucia 27 Aug '18
27 Aug '18
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d-shader/dxbc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c
index 1309b7e9ab7c..3be3ca917ac3 100644
--- a/libs/vkd3d-shader/dxbc.c
+++ b/libs/vkd3d-shader/dxbc.c
@@ -1622,7 +1622,7 @@ static void shader_sm4_read_instruction_modifier(DWORD modifier, struct vkd3d_sh
if (modifier & ~recognized_bits)
{
- FIXME("Unhandled modifier 0x%08x.\n", modifier);
+ WARN("Unhandled modifier 0x%08x.\n", modifier);
}
else
{
--
2.16.4
2
1
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
tests/d3d12.c | 194 ++++++++++++++++++++++-------------------------
tests/vkd3d_d3d12_test.h | 61 ++++++++++-----
2 files changed, 132 insertions(+), 123 deletions(-)
diff --git a/tests/d3d12.c b/tests/d3d12.c
index ca83680d36c9..7261e89e82df 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -57,17 +57,6 @@ typedef int HRESULT;
#include "vkd3d_d3d12_test.h"
-static void set_box(D3D12_BOX *box, unsigned int left, unsigned int top, unsigned int front,
- unsigned int right, unsigned int bottom, unsigned int back)
-{
- box->left = left;
- box->top = top;
- box->front = front;
- box->right = right;
- box->bottom = bottom;
- box->back = back;
-}
-
struct vec2
{
float x, y;
@@ -634,6 +623,7 @@ static void get_buffer_readback_with_command_list(ID3D12Resource *buffer, DXGI_F
rb->width = resource_desc.Width / format_size(format);
rb->height = 1;
+ rb->depth = 1;
rb->resource = rb_buffer;
rb->row_pitch = resource_desc.Width;
rb->data = NULL;
@@ -646,32 +636,32 @@ static void get_buffer_readback_with_command_list(ID3D12Resource *buffer, DXGI_F
static uint8_t get_readback_uint8(struct resource_readback *rb, unsigned int x, unsigned int y)
{
- return *(uint8_t *)get_readback_data(rb, x, y, sizeof(uint8_t));
+ return *(uint8_t *)get_readback_data(rb, x, y, 0, sizeof(uint8_t));
}
static uint16_t get_readback_uint16(struct resource_readback *rb, unsigned int x, unsigned int y)
{
- return *(uint16_t *)get_readback_data(rb, x, y, sizeof(uint16_t));
+ return *(uint16_t *)get_readback_data(rb, x, y, 0, sizeof(uint16_t));
}
static UINT64 get_readback_uint64(struct resource_readback *rb, unsigned int x, unsigned int y)
{
- return *(UINT64 *)get_readback_data(rb, x, y, sizeof(UINT64));
+ return *(UINT64 *)get_readback_data(rb, x, y, 0, sizeof(UINT64));
}
static float get_readback_float(struct resource_readback *rb, unsigned int x, unsigned int y)
{
- return *(float *)get_readback_data(rb, x, y, sizeof(float));
+ return *(float *)get_readback_data(rb, x, y, 0, sizeof(float));
}
static const struct vec4 *get_readback_vec4(struct resource_readback *rb, unsigned int x, unsigned int y)
{
- return get_readback_data(rb, x, y, sizeof(struct vec4));
+ return get_readback_data(rb, x, y, 0, sizeof(struct vec4));
}
static const struct uvec4 *get_readback_uvec4(struct resource_readback *rb, unsigned int x, unsigned int y)
{
- return get_readback_data(rb, x, y, sizeof(struct uvec4));
+ return get_readback_data(rb, x, y, 0, sizeof(struct uvec4));
}
#define check_readback_data_float(a, b, c, d) check_readback_data_float_(__LINE__, a, b, c, d)
@@ -3416,7 +3406,7 @@ static void test_clear_unordered_access_view(void)
ID3D12Device *device;
UINT clear_value[4];
unsigned int i, j;
- RECT rect;
+ D3D12_BOX box;
#define BUFFER_SIZE (1024 * 1024)
static const struct
@@ -3507,20 +3497,19 @@ static void test_clear_unordered_access_view(void)
get_cpu_descriptor_handle(&context, cpu_heap, 0),
buffer, tests[i].values, 0, NULL);
- rect.top = 0;
- rect.bottom = 1;
+ set_box(&box, 0, 0, 0, 1, 1, 1);
transition_resource_state(command_list, buffer,
D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_SOURCE);
get_buffer_readback_with_command_list(buffer, DXGI_FORMAT_R32_TYPELESS, &rb, queue, command_list);
- rect.left = 0;
- rect.right = uav_desc.Buffer.FirstElement;
- check_readback_data_uint(&rb, &rect, clear_value[0], 0);
- rect.left = uav_desc.Buffer.FirstElement;
- rect.right = uav_desc.Buffer.FirstElement + uav_desc.Buffer.NumElements;
- check_readback_data_uint(&rb, &rect, tests[i].values[0], 0);
- rect.left = uav_desc.Buffer.FirstElement + uav_desc.Buffer.NumElements;
- rect.right = BUFFER_SIZE / format_size(uav_desc.Format);
- check_readback_data_uint(&rb, &rect, clear_value[0], 0);
+ box.left = 0;
+ box.right = uav_desc.Buffer.FirstElement;
+ check_readback_data_uint(&rb, &box, clear_value[0], 0);
+ box.left = uav_desc.Buffer.FirstElement;
+ box.right = uav_desc.Buffer.FirstElement + uav_desc.Buffer.NumElements;
+ check_readback_data_uint(&rb, &box, tests[i].values[0], 0);
+ box.left = uav_desc.Buffer.FirstElement + uav_desc.Buffer.NumElements;
+ box.right = BUFFER_SIZE / format_size(uav_desc.Format);
+ check_readback_data_uint(&rb, &box, clear_value[0], 0);
release_resource_readback(&rb);
reset_command_list(command_list, context.allocator);
@@ -3994,13 +3983,13 @@ static void test_append_aligned_element(void)
transition_resource_state(command_list, context.render_target,
D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
get_texture_readback_with_command_list(context.render_target, 0, &rb, queue, command_list);
- color = get_readback_uint(&rb, 80, 16);
+ color = get_readback_uint(&rb, 80, 16, 0);
ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
- color = get_readback_uint(&rb, 240, 16);
+ color = get_readback_uint(&rb, 240, 16, 0);
ok(compare_color(color, 0xff00ff00, 1), "Got unexpected color 0x%08x.\n", color);
- color = get_readback_uint(&rb, 400, 16);
+ color = get_readback_uint(&rb, 400, 16, 0);
ok(compare_color(color, 0xffff0000, 1), "Got unexpected color 0x%08x.\n", color);
- color = get_readback_uint(&rb, 560, 16);
+ color = get_readback_uint(&rb, 560, 16, 0);
ok(compare_color(color, 0xffff00ff, 1), "Got unexpected color 0x%08x.\n", color);
release_resource_readback(&rb);
@@ -4414,15 +4403,15 @@ static void test_scissor(void)
D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
get_texture_readback_with_command_list(context.render_target, 0, &rb, queue, command_list);
- color = get_readback_uint(&rb, 320, 60);
+ color = get_readback_uint(&rb, 320, 60, 0);
ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
- color = get_readback_uint(&rb, 80, 240);
+ color = get_readback_uint(&rb, 80, 240, 0);
ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
- color = get_readback_uint(&rb, 320, 240);
+ color = get_readback_uint(&rb, 320, 240, 0);
ok(compare_color(color, 0xff00ff00, 1), "Got unexpected color 0x%08x.\n", color);
- color = get_readback_uint(&rb, 560, 240);
+ color = get_readback_uint(&rb, 560, 240, 0);
ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
- color = get_readback_uint(&rb, 320, 420);
+ color = get_readback_uint(&rb, 320, 420, 0);
ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
release_resource_readback(&rb);
@@ -5117,7 +5106,7 @@ static void test_bundle_state_inheritance(void)
{
for (x = 0; x < rb.width; ++x)
{
- unsigned int v = get_readback_uint(&rb, x, y);
+ unsigned int v = get_readback_uint(&rb, x, y, 0);
/* This works on AMD. */
ok(v == 0xffffffff || v == 0xff00ff00, "Got unexpected value 0x%08x at (%u, %u).\n", v, x, y);
}
@@ -5154,7 +5143,7 @@ static void test_bundle_state_inheritance(void)
{
for (x = 0; x < rb.width; ++x)
{
- unsigned int v = get_readback_uint(&rb, x, y);
+ unsigned int v = get_readback_uint(&rb, x, y, 0);
/* This works on AMD, even though the debug layer says that the primitive topology is undefined. */
ok(v == 0xffffffff || v == 0xff00ff00, "Got unexpected value 0x%08x at (%u, %u).\n", v, x, y);
}
@@ -8505,7 +8494,7 @@ static void test_constant_buffer_relative_addressing(void)
get_buffer_readback_with_command_list(uav, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
for (i = 0; i < rb.width; ++i)
{
- unsigned int got = get_readback_uint(&rb, i, 0);
+ unsigned int got = get_readback_uint(&rb, i, 0, 0);
const unsigned int *expected = &cb_data[1].x;
ok(got == expected[i], "Got %#x, expected %#x at %u.\n", got, expected[i], i);
}
@@ -9148,7 +9137,7 @@ static void test_texture(void)
{
for (x = 0; x < tests[i].width; ++x)
{
- unsigned int color = get_readback_uint(&rb, x * x_step + x_step / 2, y * y_step + y_step / 2);
+ unsigned int color = get_readback_uint(&rb, x * x_step + x_step / 2, y * y_step + y_step / 2, 0);
ok(compare_color(color, tests[i].expected_data[tests[i].width * y + x], 1),
"Got color 0x%08x, expected 0x%08x at (%u, %u).\n",
color, tests[i].expected_data[tests[i].width * y + x], x, y);
@@ -10210,7 +10199,7 @@ static void test_descriptor_tables_overlapping_bindings(void)
get_buffer_readback_with_command_list(output_buffers[0], DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
for (i = 0; i < ARRAY_SIZE(buffer_data); ++i)
{
- unsigned int value = get_readback_uint(&rb, i, 0);
+ unsigned int value = get_readback_uint(&rb, i, 0, 0);
ok(value == buffer_data[i], "Got %#x, expected %#x.\n", value, buffer_data[i]);
}
release_resource_readback(&rb);
@@ -10218,7 +10207,7 @@ static void test_descriptor_tables_overlapping_bindings(void)
get_buffer_readback_with_command_list(output_buffers[1], DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
for (i = 0; i < ARRAY_SIZE(buffer_data2); ++i)
{
- unsigned int value = get_readback_uint(&rb, i, 0);
+ unsigned int value = get_readback_uint(&rb, i, 0, 0);
ok(value == buffer_data2[i], "Got %#x, expected %#x.\n", value, buffer_data2[i]);
}
release_resource_readback(&rb);
@@ -10336,7 +10325,7 @@ static void test_update_root_descriptors(void)
for (i = 0; i < ARRAY_SIZE(input); ++i)
{
unsigned int offset = input[i].uav_offset + input[i].offset;
- unsigned int value = get_readback_uint(&rb, offset, 0);
+ unsigned int value = get_readback_uint(&rb, offset, 0, 0);
ok(value == input[i].value, "Got %#x, expected %#x.\n", value, input[i].value);
}
release_resource_readback(&rb);
@@ -10364,6 +10353,7 @@ static void test_update_descriptor_tables(void)
ID3D12Resource *textures[3];
ID3D12CommandQueue *queue;
unsigned int i;
+ D3D12_BOX box;
HRESULT hr;
RECT rect;
@@ -10505,10 +10495,10 @@ static void test_update_descriptor_tables(void)
transition_resource_state(command_list, context.render_target,
D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
get_texture_readback_with_command_list(context.render_target, 0, &rb, queue, command_list);
- set_rect(&rect, 0, 0, 16, 32);
- check_readback_data_uint(&rb, &rect, 0xff00407f, 1);
- set_rect(&rect, 16, 0, 32, 32);
- check_readback_data_uint(&rb, &rect, 0xff007f40, 1);
+ set_box(&box, 0, 0, 0, 16, 32, 1);
+ check_readback_data_uint(&rb, &box, 0xff00407f, 1);
+ set_box(&box, 16, 0, 0, 32, 32, 1);
+ check_readback_data_uint(&rb, &box, 0xff007f40, 1);
release_resource_readback(&rb);
for (i = 0; i < ARRAY_SIZE(textures); ++i)
@@ -10634,7 +10624,7 @@ static void test_update_descriptor_heap_after_closing_command_list(void)
transition_resource_state(command_list, context.render_target,
D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
get_texture_readback_with_command_list(context.render_target, 0, &rb, queue, command_list);
- value = get_readback_uint(&rb, 0, 0);
+ value = get_readback_uint(&rb, 0, 0, 0);
todo(value == 0xff00ff00, "Got unexpected value %#x.\n", value);
release_resource_readback(&rb);
@@ -11153,7 +11143,7 @@ static void test_update_compute_descriptor_tables(void)
get_buffer_readback_with_command_list(output_buffers[0], DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
for (i = 0; i < ARRAY_SIZE(expected_output0); ++i)
{
- data = get_readback_uint(&rb, i, 0);
+ data = get_readback_uint(&rb, i, 0, 0);
ok(data == expected_output0[i], "Got %#x, expected %#x at %u.\n", data, expected_output0[i], i);
}
release_resource_readback(&rb);
@@ -11164,7 +11154,7 @@ static void test_update_compute_descriptor_tables(void)
get_buffer_readback_with_command_list(output_buffers[1], DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
for (i = 0; i < ARRAY_SIZE(expected_output1); ++i)
{
- data = get_readback_uint(&rb, i, 0);
+ data = get_readback_uint(&rb, i, 0, 0);
ok(data == expected_output1[i], "Got %#x, expected %#x at %u.\n", data, expected_output1[i], i);
}
release_resource_readback(&rb);
@@ -11669,7 +11659,7 @@ static void test_copy_descriptors(void)
transition_sub_resource_state(command_list, u[2], 0,
D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_SOURCE);
get_buffer_readback_with_command_list(u[2], DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
- result = get_readback_data(&rb, 0, 0, sizeof(*result));
+ result = get_readback_data(&rb, 0, 0, 0, sizeof(*result));
ok(result[ 0] == cb0_data, "Got unexpected value %#x.\n", result[0]);
ok(result[ 1] == cb1_data, "Got unexpected value %#x.\n", result[1]);
ok(result[ 2] == cb2_data, "Got unexpected value %#x.\n", result[2]);
@@ -11747,7 +11737,7 @@ static void test_copy_descriptors_range_sizes(void)
ID3D12CommandQueue *queue;
ID3D12Device *device;
unsigned int i;
- RECT rect;
+ D3D12_BOX box;
static const DWORD ps_code[] =
{
@@ -11883,8 +11873,8 @@ static void test_copy_descriptors_range_sizes(void)
get_texture_readback_with_command_list(context.render_target, 0, &rb, queue, command_list);
for (i = 0; i < desc.rt_width; ++i)
{
- set_rect(&rect, i, 0, i + 1, desc.rt_height);
- check_readback_data_uint(&rb, &rect, i % 2 ? 0xffff0000 : 0xff00ff00, 0);
+ set_box(&box, i, 0, 0, i + 1, desc.rt_height, 1);
+ check_readback_data_uint(&rb, &box, i % 2 ? 0xffff0000 : 0xff00ff00, 0);
}
release_resource_readback(&rb);
@@ -13838,7 +13828,7 @@ static void test_tgsm(void)
get_buffer_readback_with_command_list(buffer, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
for (i = 0; i < 64; ++i)
{
- data = get_readback_uint(&rb, i, 0);
+ data = get_readback_uint(&rb, i, 0, 0);
expected = 33 * i;
ok(data == expected, "Got %u, expected %u (index %u).\n", data, expected, i);
}
@@ -13887,7 +13877,7 @@ static void test_tgsm(void)
for (i = 0; i < 32; ++i)
{
expected = 64 * i + 32;
- data = get_readback_uint(&rb, i, 0);
+ data = get_readback_uint(&rb, i, 0, 0);
ok(data == expected, "Got %u, expected %u (index %u).\n", data, expected, i);
}
release_resource_readback(&rb);
@@ -13896,7 +13886,7 @@ static void test_tgsm(void)
for (i = 0; i < 32; ++i)
{
expected = 64 * i + 32;
- data = get_readback_uint(&rb, i, 0);
+ data = get_readback_uint(&rb, i, 0, 0);
ok(data == expected || !data, "Got %u, expected %u (index %u).\n", data, expected, i);
}
release_resource_readback(&rb);
@@ -13945,7 +13935,7 @@ static void test_tgsm(void)
for (i = 0; i < 96; ++i)
{
expected = (i % 32 + 1) * (i / 32);
- data = get_readback_uint(&rb, i, 0);
+ data = get_readback_uint(&rb, i, 0, 0);
ok(data == expected, "Got %u, expected %u (index %u).\n", data, expected, i);
}
release_resource_readback(&rb);
@@ -14352,7 +14342,7 @@ static void test_uav_load(void)
for (x = 0; x < 4; ++x)
{
unsigned int expected = test->expected_colors[y * 4 + x];
- unsigned int color = get_readback_uint(&rb, 80 + x * 160, 60 + y * 120);
+ unsigned int color = get_readback_uint(&rb, 80 + x * 160, 60 + y * 120, 0);
ok(compare_color(color, expected, 0),
"Test %u: Got 0x%08x, expected 0x%08x at (%u, %u).\n",
i, color, expected, x, y);
@@ -14770,7 +14760,7 @@ static unsigned int read_uav_counter(const struct test_context *context,
D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_SOURCE);
get_buffer_readback_with_command_list(counter_buffer, DXGI_FORMAT_R32_UINT, &rb,
context->queue, context->list);
- counter = get_readback_uint(&rb, offset / sizeof(counter), 0);
+ counter = get_readback_uint(&rb, offset / sizeof(counter), 0, 0);
release_resource_readback(&rb);
reset_command_list(context->list, context->allocator);
transition_sub_resource_state(context->list, counter_buffer, 0,
@@ -14989,7 +14979,7 @@ static void test_uav_counters(void)
get_buffer_readback_with_command_list(out_buffer, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
for (i = 0; i < 8; ++i)
{
- data = get_readback_uint(&rb, i, 0);
+ data = get_readback_uint(&rb, i, 0, 0);
ok(data == 0xdeadbeef, "Got data %u at %u.\n", data, i);
}
release_resource_readback(&rb);
@@ -15359,7 +15349,7 @@ static void test_atomic_instructions(void)
get_buffer_readback_with_command_list(ps_buffer, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
for (j = 0; j < ARRAY_SIZE(instructions); ++j)
{
- unsigned int value = get_readback_uint(&rb, j, 0);
+ unsigned int value = get_readback_uint(&rb, j, 0, 0);
unsigned int expected = test->expected_result[j];
if (test->i.x < 0
@@ -15384,7 +15374,7 @@ static void test_atomic_instructions(void)
{
BOOL todo_instruction = !strcmp(imm_instructions[j], "imm_atomic_imax")
|| !strcmp(imm_instructions[j], "imm_atomic_imin");
- unsigned int value = get_readback_uint(&rb, j, 0);
+ unsigned int value = get_readback_uint(&rb, j, 0, 0);
unsigned int expected = test->expected_result[j];
if (test->i.x < 0 && todo_instruction)
@@ -15406,7 +15396,7 @@ static void test_atomic_instructions(void)
get_buffer_readback_with_command_list(cs_buffer2, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
for (j = 0; j < ARRAY_SIZE(instructions); ++j)
{
- unsigned int out_value = get_readback_uint(&rb, j, 0);
+ unsigned int out_value = get_readback_uint(&rb, j, 0, 0);
ok(out_value == test->input[j], "Got original value %u, expected %u for '%s'.\n",
out_value, test->input[j], imm_instructions[j]);
}
@@ -15708,7 +15698,7 @@ static void test_buffer_srv(void)
{
for (x = 0; x < 4; ++x)
{
- color = get_readback_uint(&rb, 80 + x * 160, 60 + y * 120);
+ color = get_readback_uint(&rb, 80 + x * 160, 60 + y * 120, 0);
expected_color = test->expected_colors[y * 4 + x];
ok(compare_color(color, expected_color, 1),
"Test %u: Got 0x%08x, expected 0x%08x at (%u, %u).\n",
@@ -15905,7 +15895,7 @@ static void test_query_pipeline_statistics(void)
ok(!value, "Element %d: Got %"PRIu64", expected 0.\n", i, value);
}
- pipeline_statistics = get_readback_data(&rb, 1, 0, sizeof(*pipeline_statistics));
+ pipeline_statistics = get_readback_data(&rb, 1, 0, 0, sizeof(*pipeline_statistics));
/* We read 3 vertices that formed one primitive. */
ok(pipeline_statistics->IAVertices == 3, "IAVertices: Got %"PRIu64", expected 3.\n",
@@ -16118,7 +16108,7 @@ static void test_resolve_non_issued_query_data(void)
D3D12_QUERY_TYPE_TIMESTAMP, 0, 4, readback_buffer, 0);
get_buffer_readback_with_command_list(readback_buffer, DXGI_FORMAT_UNKNOWN, &rb, queue, command_list);
- timestamps = get_readback_data(&rb, 0, 0, sizeof(*timestamps));
+ timestamps = get_readback_data(&rb, 0, 0, 0, sizeof(*timestamps));
ok(timestamps[0] != initial_data[0] && timestamps[0] > 0,
"Got unexpected timestamp %#"PRIx64".\n", timestamps[0]);
ok(!timestamps[1], "Got unexpected timestamp %#"PRIx64".\n", timestamps[1]);
@@ -16405,7 +16395,7 @@ static void test_execute_indirect(void)
get_buffer_readback_with_command_list(uav, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
for (i = 0; i < rb.width; ++i)
{
- unsigned int ret = get_readback_uint(&rb, i, 0);
+ unsigned int ret = get_readback_uint(&rb, i, 0, 0);
ok(ret == i, "Got unexpected result %#x at index %u.\n", ret, i);
}
release_resource_readback(&rb);
@@ -16533,9 +16523,9 @@ static void test_dispatch_zero_thread_groups(void)
transition_sub_resource_state(command_list, uav, 0,
D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_SOURCE);
get_buffer_readback_with_command_list(uav, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
- ret = get_readback_uint(&rb, 0, 0);
+ ret = get_readback_uint(&rb, 0, 0, 0);
ok(ret == 10, "Got unexpected result %#x.\n", ret);
- ret = get_readback_uint(&rb, 64, 0);
+ ret = get_readback_uint(&rb, 64, 0, 0);
ok(ret == 50, "Got unexpected result %#x.\n", ret);
release_resource_readback(&rb);
@@ -16685,29 +16675,29 @@ static void test_instance_id(void)
};
static const struct
{
- RECT rect;
+ D3D12_BOX box;
unsigned int color;
unsigned int instance_id;
}
expected_results[] =
{
- {{ 0, 0, 10, 10}, 0xfff0f0f0, 0},
- {{10, 0, 20, 10}, 0xff808080, 1},
- {{20, 0, 30, 10}, 0xff101010, 2},
- {{30, 0, 40, 10}, 0xff404040, 3},
- {{40, 0, 50, 10}, 0xffaaaaaa, 0},
- {{50, 0, 60, 10}, 0xffbbbbbb, 1},
- {{60, 0, 70, 10}, 0xffcccccc, 2},
- {{70, 0, 80, 10}, 0xff909090, 3},
+ {{ 0, 0, 0, 10, 10, 1}, 0xfff0f0f0, 0},
+ {{10, 0, 0, 20, 10, 1}, 0xff808080, 1},
+ {{20, 0, 0, 30, 10, 1}, 0xff101010, 2},
+ {{30, 0, 0, 40, 10, 1}, 0xff404040, 3},
+ {{40, 0, 0, 50, 10, 1}, 0xffaaaaaa, 0},
+ {{50, 0, 0, 60, 10, 1}, 0xffbbbbbb, 1},
+ {{60, 0, 0, 70, 10, 1}, 0xffcccccc, 2},
+ {{70, 0, 0, 80, 10, 1}, 0xff909090, 3},
/* indirect draws results */
- {{ 0, 10, 10, 20}, 0xfff0f0f0, 0},
- {{10, 10, 20, 20}, 0xff808080, 1},
- {{20, 10, 30, 20}, 0xff101010, 2},
- {{30, 10, 40, 20}, 0xff404040, 3},
- {{40, 10, 50, 20}, 0xffaaaaaa, 0},
- {{50, 10, 60, 20}, 0xffbbbbbb, 1},
- {{60, 10, 70, 20}, 0xffcccccc, 2},
- {{70, 10, 80, 20}, 0xff909090, 3},
+ {{ 0, 10, 0, 10, 20, 1}, 0xfff0f0f0, 0},
+ {{10, 10, 0, 20, 20, 1}, 0xff808080, 1},
+ {{20, 10, 0, 30, 20, 1}, 0xff101010, 2},
+ {{30, 10, 0, 40, 20, 1}, 0xff404040, 3},
+ {{40, 10, 0, 50, 20, 1}, 0xffaaaaaa, 0},
+ {{50, 10, 0, 60, 20, 1}, 0xffbbbbbb, 1},
+ {{60, 10, 0, 70, 20, 1}, 0xffcccccc, 2},
+ {{70, 10, 0, 80, 20, 1}, 0xff909090, 3},
};
static const float white[] = {1.0f, 1.0f, 1.0f, 1.0f};
@@ -16779,14 +16769,14 @@ static void test_instance_id(void)
D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
get_texture_readback_with_command_list(context.render_target, 0, &rb, queue, command_list);
for (i = 0; i < ARRAY_SIZE(expected_results); ++i)
- check_readback_data_uint(&rb, &expected_results[i].rect, expected_results[i].color, 1);
+ check_readback_data_uint(&rb, &expected_results[i].box, expected_results[i].color, 1);
release_resource_readback(&rb);
reset_command_list(command_list, context.allocator);
transition_resource_state(command_list, render_target,
D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
get_texture_readback_with_command_list(render_target, 0, &rb, queue, command_list);
for (i = 0; i < ARRAY_SIZE(expected_results); ++i)
- check_readback_data_uint(&rb, &expected_results[i].rect, expected_results[i].instance_id, 0);
+ check_readback_data_uint(&rb, &expected_results[i].box, expected_results[i].instance_id, 0);
release_resource_readback(&rb);
ID3D12CommandSignature_Release(command_signature);
@@ -16910,7 +16900,7 @@ static void test_copy_texture_region(void)
{
for (x = 0; x < 4; ++x)
{
- unsigned int color = get_readback_uint(&rb, x, y);
+ unsigned int color = get_readback_uint(&rb, x, y, 0);
unsigned int expected = result_data[y * 4 + x];
ok(color == expected,
@@ -17895,29 +17885,29 @@ static void test_geometry_shader(void)
D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
get_texture_readback_with_command_list(context.render_target, 0, &rb, queue, command_list);
- color = get_readback_uint(&rb, 320, 190);
+ color = get_readback_uint(&rb, 320, 190, 0);
ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
- color = get_readback_uint(&rb, 255, 240);
+ color = get_readback_uint(&rb, 255, 240, 0);
ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
- color = get_readback_uint(&rb, 320, 240);
+ color = get_readback_uint(&rb, 320, 240, 0);
ok(compare_color(color, 0xffffff00, 1), "Got unexpected color 0x%08x.\n", color);
- color = get_readback_uint(&rb, 385, 240);
+ color = get_readback_uint(&rb, 385, 240, 0);
ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
- color = get_readback_uint(&rb, 320, 290);
+ color = get_readback_uint(&rb, 320, 290, 0);
ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
release_resource_readback(&rb);
reset_command_list(command_list, context.allocator);
get_texture_readback_with_command_list(texture, 0, &rb, queue, command_list);
- color = get_readback_uint(&rb, 320, 190);
+ color = get_readback_uint(&rb, 320, 190, 0);
ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
- color = get_readback_uint(&rb, 255, 240);
+ color = get_readback_uint(&rb, 255, 240, 0);
ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
- color = get_readback_uint(&rb, 320, 240);
+ color = get_readback_uint(&rb, 320, 240, 0);
ok(compare_color(color, 0xffffff00, 1), "Got unexpected color 0x%08x.\n", color);
- color = get_readback_uint(&rb, 385, 240);
+ color = get_readback_uint(&rb, 385, 240, 0);
ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
- color = get_readback_uint(&rb, 320, 290);
+ color = get_readback_uint(&rb, 320, 290, 0);
ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
release_resource_readback(&rb);
diff --git a/tests/vkd3d_d3d12_test.h b/tests/vkd3d_d3d12_test.h
index 67e4ddb3aae2..b7fd5ebcc4eb 100644
--- a/tests/vkd3d_d3d12_test.h
+++ b/tests/vkd3d_d3d12_test.h
@@ -31,6 +31,17 @@ static void set_rect(RECT *rect, int left, int top, int right, int bottom)
rect->bottom = bottom;
}
+static inline void set_box(D3D12_BOX *box, unsigned int left, unsigned int top, unsigned int front,
+ unsigned int right, unsigned int bottom, unsigned int back)
+{
+ box->left = left;
+ box->top = top;
+ box->front = front;
+ box->right = right;
+ box->bottom = bottom;
+ box->back = back;
+}
+
static void set_viewport(D3D12_VIEWPORT *vp, float x, float y,
float width, float height, float min_depth, float max_depth)
{
@@ -197,6 +208,7 @@ struct resource_readback
{
unsigned int width;
unsigned int height;
+ unsigned int depth;
ID3D12Resource *resource;
unsigned int row_pitch;
void *data;
@@ -219,18 +231,18 @@ static void get_texture_readback_with_command_list(ID3D12Resource *texture, unsi
resource_desc = ID3D12Resource_GetDesc(texture);
ok(resource_desc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER,
"Resource %p is not texture.\n", texture);
- ok(resource_desc.Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE3D,
- "Readback not implemented for 3D textures.\n");
miplevel = sub_resource % resource_desc.MipLevels;
rb->width = max(1, resource_desc.Width >> miplevel);
rb->height = max(1, resource_desc.Height >> miplevel);
+ rb->depth = resource_desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D
+ ? resource_desc.DepthOrArraySize : 1;
rb->row_pitch = align(rb->width * format_size(resource_desc.Format), D3D12_TEXTURE_DATA_PITCH_ALIGNMENT);
rb->data = NULL;
format = resource_desc.Format;
- rb->resource = create_readback_buffer(device, rb->row_pitch * rb->height);
+ rb->resource = create_readback_buffer(device, rb->row_pitch * rb->height * rb->depth);
dst_location.pResource = rb->resource;
dst_location.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
@@ -238,7 +250,7 @@ static void get_texture_readback_with_command_list(ID3D12Resource *texture, unsi
dst_location.PlacedFootprint.Footprint.Format = format;
dst_location.PlacedFootprint.Footprint.Width = rb->width;
dst_location.PlacedFootprint.Footprint.Height = rb->height;
- dst_location.PlacedFootprint.Footprint.Depth = 1;
+ dst_location.PlacedFootprint.Footprint.Depth = rb->depth;
dst_location.PlacedFootprint.Footprint.RowPitch = rb->row_pitch;
src_location.pResource = texture;
@@ -259,15 +271,17 @@ static void get_texture_readback_with_command_list(ID3D12Resource *texture, unsi
ok(SUCCEEDED(hr), "Failed to map readback buffer, hr %#x.\n", hr);
}
-static void *get_readback_data(struct resource_readback *rb, unsigned int x, unsigned int y,
- size_t element_size)
+static void *get_readback_data(struct resource_readback *rb,
+ unsigned int x, unsigned int y, unsigned int z, size_t element_size)
{
- return &((BYTE *)rb->data)[rb->row_pitch * y + x * element_size];
+ unsigned int slice_pitch = rb->row_pitch * rb->depth;
+ return &((BYTE *)rb->data)[slice_pitch * z + rb->row_pitch * y + x * element_size];
}
-static unsigned int get_readback_uint(struct resource_readback *rb, unsigned int x, unsigned int y)
+static unsigned int get_readback_uint(struct resource_readback *rb,
+ unsigned int x, unsigned int y, unsigned int z)
{
- return *(unsigned int *)get_readback_data(rb, x, y, sizeof(unsigned int));
+ return *(unsigned int *)get_readback_data(rb, x, y, z, sizeof(unsigned int));
}
static void release_resource_readback(struct resource_readback *rb)
@@ -279,31 +293,36 @@ static void release_resource_readback(struct resource_readback *rb)
#define check_readback_data_uint(a, b, c, d) check_readback_data_uint_(__LINE__, a, b, c, d)
static void check_readback_data_uint_(unsigned int line, struct resource_readback *rb,
- const RECT *rect, unsigned int expected, unsigned int max_diff)
+ const D3D12_BOX *box, unsigned int expected, unsigned int max_diff)
{
- RECT r = {0, 0, rb->width, rb->height};
- unsigned int x = 0, y;
+ D3D12_BOX b = {0, 0, 0, rb->width, rb->height, rb->depth};
+ unsigned int x = 0, y = 0, z;
bool all_match = true;
unsigned int got = 0;
- if (rect)
- r = *rect;
+ if (box)
+ b = *box;
- for (y = r.top; y < r.bottom; ++y)
+ for (z = b.front; z < b.back; ++z)
{
- for (x = r.left; x < r.right; ++x)
+ for (y = b.top; y < b.bottom; ++y)
{
- got = get_readback_uint(rb, x, y);
- if (!compare_color(got, expected, max_diff))
+ for (x = b.left; x < b.right; ++x)
{
- all_match = false;
- break;
+ got = get_readback_uint(rb, x, y, z);
+ if (!compare_color(got, expected, max_diff))
+ {
+ all_match = false;
+ break;
+ }
}
+ if (!all_match)
+ break;
}
if (!all_match)
break;
}
- ok_(line)(all_match, "Got 0x%08x, expected 0x%08x at (%u, %u).\n", got, expected, x, y);
+ ok_(line)(all_match, "Got 0x%08x, expected 0x%08x at (%u, %u, %u).\n", got, expected, x, y, z);
}
#define check_sub_resource_uint(a, b, c, d, e, f) check_sub_resource_uint_(__LINE__, a, b, c, d, e, f)
--
2.16.4
2
1
[PATCH vkd3d 07/10] vkd3d: Rename vkd3d_queue_gpu_fence() to vkd3d_enqueue_gpu_fence().
by Józef Kucia 27 Aug '18
by Józef Kucia 27 Aug '18
27 Aug '18
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d/command.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 7aa16957e114..16c61352ed76 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -78,7 +78,7 @@ static void vkd3d_queue_release(struct vkd3d_queue *queue)
}
/* Fence worker thread */
-static HRESULT vkd3d_queue_gpu_fence(struct vkd3d_fence_worker *worker,
+static HRESULT vkd3d_enqueue_gpu_fence(struct vkd3d_fence_worker *worker,
VkFence vk_fence, ID3D12Fence *fence, UINT64 value)
{
int rc;
@@ -4486,7 +4486,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_queue_Signal(ID3D12CommandQueue *
return hresult_from_vk_result(vr);
}
- return vkd3d_queue_gpu_fence(&device->fence_worker, vk_fence, fence, value);
+ return vkd3d_enqueue_gpu_fence(&device->fence_worker, vk_fence, fence, value);
}
static HRESULT STDMETHODCALLTYPE d3d12_command_queue_Wait(ID3D12CommandQueue *iface,
--
2.16.4
2
1
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d/state.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c
index 5e401fdd9523..446e1a65029d 100644
--- a/libs/vkd3d/state.c
+++ b/libs/vkd3d/state.c
@@ -2180,6 +2180,9 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s
ds_desc_from_d3d12(&graphics->ds_desc, &desc->DepthStencilState);
+ if (desc->SampleDesc.Count != 1)
+ FIXME("Ignoring sample desc %u, %u.\n", desc->SampleDesc.Count, desc->SampleDesc.Quality);
+
graphics->root_signature = root_signature;
state->vk_bind_point = VK_PIPELINE_BIND_POINT_GRAPHICS;
--
2.16.4
2
1
27 Aug '18
v2: Removed SetLastError and return E_NOTIMPL
Found this trying to start newest firefox 61.0.2. This prevents crashing
it.
(note: also removed a superfluous extra empty line few lines above this
change)
To: wine-devel <wine-devel(a)winehq.org>
Signed-off-by: Louis Lenders <xerox.xerox2000x(a)gmail.com>
---
dlls/kernel32/kernel32.spec | 2 +-
dlls/kernel32/process.c | 10 +++++++++-
include/winbase.h | 1 +
3 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index c53276c70a..f1d75b8e1c 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -543,7 +543,7 @@
@ stdcall GetActiveProcessorCount(long)
@ stdcall GetActiveProcessorGroupCount()
# @ stub GetApplicationRecoveryCallback
-# @ stub GetApplicationRestartSettings
+@ stdcall GetApplicationRestartSettings(long ptr ptr ptr)
@ stdcall GetAtomNameA(long ptr long)
@ stdcall GetAtomNameW(long ptr long)
@ stdcall GetBinaryType(str ptr) GetBinaryTypeA
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index d615f06c4a..ad61d18dbe 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -3953,7 +3953,6 @@ BOOL WINAPI CmdBatNotification( BOOL bBatchRunning )
return FALSE;
}
-
/***********************************************************************
* RegisterApplicationRestart (KERNEL32.@)
*/
@@ -4023,6 +4022,15 @@ HRESULT WINAPI RegisterApplicationRecoveryCallback(APPLICATION_RECOVERY_CALLBACK
return E_FAIL;
}
+/***********************************************************************
+ * GetApplicationRestartSettings (KERNEL32.@)
+ */
+HRESULT WINAPI GetApplicationRestartSettings(HANDLE process, WCHAR *cmdline, DWORD *size, DWORD *flags)
+{
+ FIXME("%p, %p, %p, %p)\n", process, cmdline, size, flags);
+ return E_NOTIMPL;
+}
+
/**********************************************************************
* GetNumaHighestNodeNumber (KERNEL32.@)
*/
diff --git a/include/winbase.h b/include/winbase.h
index aa57dae818..8b26308b95 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -2038,6 +2038,7 @@ WINBASEAPI BOOL WINAPI FreeResource(HGLOBAL);
WINADVAPI PVOID WINAPI FreeSid(PSID);
WINADVAPI BOOL WINAPI GetAce(PACL,DWORD,LPVOID*);
WINADVAPI BOOL WINAPI GetAclInformation(PACL,LPVOID,DWORD,ACL_INFORMATION_CLASS);
+WINBASEAPI HRESULT WINAPI GetApplicationRestartSettings(HANDLE,WCHAR*,DWORD*,DWORD*);
WINBASEAPI UINT WINAPI GetAtomNameA(ATOM,LPSTR,INT);
WINBASEAPI UINT WINAPI GetAtomNameW(ATOM,LPWSTR,INT);
#define GetAtomName WINELIB_NAME_AW(GetAtomName)
--
2.17.1
1
0