aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Mike Klein <mtklein@chromium.org>2017-07-31 11:57:21 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-07-31 18:39:23 +0000
commitc722f79b6c8919e1a8a0df6d4d7735c5a8a1b5e8 (patch)
treef85d2595f5545e2f01d89cc1cf2a0d412cb0d5ea
parentd301629d1dad5da36d6f8225f17b92a3f36eaf2a (diff)
clang on windows support
1) Run python bin/fetch-clang-win 2) Set clang_win = "../bin/clang_win" 3) ??? 4) Profit Most changes here are to pass the right -mfoo flags to Clang to enable advanced instruction sets, or fixed warning-as-errors. BUG=skia:2679 Change-Id: Ieed145d35c209131c7c16fdd3ee11a3de4a1a921 Reviewed-on: https://skia-review.googlesource.com/28740 Reviewed-by: Ben Wagner <bungeman@google.com> Commit-Queue: Mike Klein <mtklein@chromium.org>
-rw-r--r--.gitignore3
-rw-r--r--BUILD.gn10
-rw-r--r--bin/fetch-clang-win40
-rw-r--r--gn/BUILD.gn10
-rw-r--r--gn/BUILDCONFIG.gn11
-rw-r--r--gn/toolchain/BUILD.gn11
-rw-r--r--include/core/SkPostConfig.h2
-rw-r--r--samplecode/SampleBigGradient.cpp6
-rw-r--r--src/ports/SkImageEncoder_WIC.cpp2
-rw-r--r--src/utils/win/SkWGL_win.cpp2
-rw-r--r--src/views/win/SkOSWindow_win.cpp52
-rw-r--r--third_party/libwebp/BUILD.gn57
-rw-r--r--third_party/zlib/BUILD.gn2
-rw-r--r--tools/colorspaceinfo.cpp2
-rw-r--r--tools/sk_tool_utils.cpp2
-rw-r--r--tools/viewer/Viewer.cpp2
16 files changed, 121 insertions, 93 deletions
diff --git a/.gitignore b/.gitignore
index 0456db8faa..7705bdf68a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -43,6 +43,7 @@ bin/gn
bin/gn.exe
bin/clang-format
bin/clang-format.exe
+bin/clang_win
vulkan-out
-gl-out \ No newline at end of file
+gl-out
diff --git a/BUILD.gn b/BUILD.gn
index 5956f6729a..d837d1db0a 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -250,7 +250,7 @@ opts("crc32") {
opts("sse2") {
enabled = is_x86
sources = skia_opts.sse2_sources
- if (is_win) {
+ if (!is_clang && is_win) {
defines = [ "SK_CPU_SSE_LEVEL=SK_CPU_SSE_LEVEL_SSE2" ]
} else {
cflags = [ "-msse2" ]
@@ -260,7 +260,7 @@ opts("sse2") {
opts("ssse3") {
enabled = is_x86
sources = skia_opts.ssse3_sources
- if (is_win) {
+ if (!is_clang && is_win) {
defines = [ "SK_CPU_SSE_LEVEL=SK_CPU_SSE_LEVEL_SSSE3" ]
} else {
cflags = [ "-mssse3" ]
@@ -270,7 +270,7 @@ opts("ssse3") {
opts("sse41") {
enabled = is_x86
sources = skia_opts.sse41_sources
- if (is_win) {
+ if (!is_clang && is_win) {
defines = [ "SK_CPU_SSE_LEVEL=SK_CPU_SSE_LEVEL_SSE41" ]
} else {
cflags = [ "-msse4.1" ]
@@ -280,7 +280,7 @@ opts("sse41") {
opts("sse42") {
enabled = is_x86
sources = skia_opts.sse42_sources
- if (is_win) {
+ if (!is_clang && is_win) {
defines = [ "SK_CPU_SSE_LEVEL=SK_CPU_SSE_LEVEL_SSE42" ]
} else {
cflags = [ "-msse4.2" ]
@@ -290,7 +290,7 @@ opts("sse42") {
opts("avx") {
enabled = is_x86
sources = skia_opts.avx_sources
- if (is_win) {
+ if (!is_clang && is_win) {
cflags = [ "/arch:AVX" ]
} else {
cflags = [ "-mavx" ]
diff --git a/bin/fetch-clang-win b/bin/fetch-clang-win
new file mode 100644
index 0000000000..06ff07b12c
--- /dev/null
+++ b/bin/fetch-clang-win
@@ -0,0 +1,40 @@
+#!/usr/bin/env python
+
+# Copyright 2017 Google Inc.
+#
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+VERSION = '308728-3'
+MD5 = '8bec8c34da5d256e27638383667489e5'
+
+import hashlib
+import os
+import shutil
+import tarfile
+import urllib2
+
+os.chdir(os.path.dirname(__file__))
+
+if (not os.path.exists('clang_win/md5.txt')
+ or open('clang_win/md5.txt').read().strip() != MD5):
+
+ # Clear out everything and start fresh.
+ shutil.rmtree('clang_win', ignore_errors=True)
+ os.mkdir('clang_win')
+ os.chdir('clang_win')
+
+ # Grab the current Clang package.
+ with open(VERSION + '.tgz', 'wb') as tgz:
+ url = 'https://commondatastorage.googleapis.com/chromium-browser-clang'
+ tgz.write(urllib2.urlopen(url + '/Win/clang-' + VERSION + '.tgz').read())
+
+ # Extract it.
+ tarfile.open(VERSION + '.tgz').extractall()
+
+ # Write out its hash to md5.txt so that next time is quicker.
+ h = hashlib.md5()
+ with open(VERSION + '.tgz', 'rb') as tgz:
+ h.update(tgz.read())
+ with open('md5.txt', 'w') as md5:
+ md5.write(h.hexdigest())
diff --git a/gn/BUILD.gn b/gn/BUILD.gn
index 71475a8110..ca9059d2c1 100644
--- a/gn/BUILD.gn
+++ b/gn/BUILD.gn
@@ -13,16 +13,6 @@ declare_args() {
malloc = ""
}
-is_clang = is_android || is_ios || is_mac || (cc == "clang" && cxx == "clang++")
-if (!is_clang && !is_win) {
- is_clang = exec_script("is_clang.py",
- [
- cc,
- cxx,
- ],
- "value")
-}
-
if (is_ios) {
if (is_tvos) {
sdk = "appletvos"
diff --git a/gn/BUILDCONFIG.gn b/gn/BUILDCONFIG.gn
index 43f66f8832..ca91c1bcb3 100644
--- a/gn/BUILDCONFIG.gn
+++ b/gn/BUILDCONFIG.gn
@@ -23,6 +23,7 @@ declare_args() {
cxx = "c++"
msvc = 2015
+ clang_win = ""
}
declare_args() {
is_debug = !is_official_build
@@ -68,6 +69,16 @@ if (current_cpu == "") {
current_cpu = target_cpu
}
+is_clang = is_android || is_ios || is_mac || (cc == "clang" && cxx == "clang++") || clang_win != ""
+if (!is_clang && !is_win) {
+ is_clang = exec_script("gn/is_clang.py",
+ [
+ cc,
+ cxx,
+ ],
+ "value")
+}
+
if (is_android) {
ndk_host = ""
ndk_target = ""
diff --git a/gn/toolchain/BUILD.gn b/gn/toolchain/BUILD.gn
index c5b13107c5..14a8a91965 100644
--- a/gn/toolchain/BUILD.gn
+++ b/gn/toolchain/BUILD.gn
@@ -50,6 +50,13 @@ toolchain("msvc") {
}
}
+ if (clang_win != "") {
+ cl = "$clang_win/bin/clang-cl.exe"
+ } else {
+ cl = "$bin/cl.exe"
+ }
+
+
tool("asm") {
_ml = "ml"
if (target_cpu == "x64") {
@@ -68,7 +75,7 @@ toolchain("msvc") {
pdbname = "{{target_out_dir}}/{{label_name}}_c.pdb"
# Label names may have spaces so pdbname must be quoted.
- command = "$env_setup$bin/cl.exe /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
+ command = "$env_setup$cl /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
depsformat = "msvc"
outputs = [
"{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj",
@@ -83,7 +90,7 @@ toolchain("msvc") {
pdbname = "{{target_out_dir}}/{{label_name}}_c.pdb"
# Label names may have spaces so pdbname must be quoted.
- command = "$env_setup$bin/cl.exe /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
+ command = "$env_setup$cl /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
depsformat = "msvc"
outputs = [
"{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj",
diff --git a/include/core/SkPostConfig.h b/include/core/SkPostConfig.h
index 8dcc18c04e..3a39f66c8f 100644
--- a/include/core/SkPostConfig.h
+++ b/include/core/SkPostConfig.h
@@ -245,7 +245,7 @@
//////////////////////////////////////////////////////////////////////
#if !defined(SK_UNUSED)
-# if defined(_MSC_VER)
+# if !defined(__clang__) && defined(_MSC_VER)
# define SK_UNUSED __pragma(warning(suppress:4189))
# else
# define SK_UNUSED SK_ATTRIBUTE(unused)
diff --git a/samplecode/SampleBigGradient.cpp b/samplecode/SampleBigGradient.cpp
index b5b01c76fa..9d850c905a 100644
--- a/samplecode/SampleBigGradient.cpp
+++ b/samplecode/SampleBigGradient.cpp
@@ -164,7 +164,8 @@ public:
HDC hdc = (HDC)fCanvas->accessTopRasterHandle();
COLORREF cr = RGB(SkColorGetR(c), SkColorGetG(c), SkColorGetB(c));// SkEndian_Swap32(c) >> 8;
- FillRect(hdc, &toRECT(r.round()), CreateSolidBrush(cr));
+ RECT rounded = toRECT(r.round());
+ FillRect(hdc, &rounded, CreateSolidBrush(cr));
// Assuming GDI wrote zeros for alpha, this will or-in 0xFF for alpha
SkPaint paint;
@@ -244,7 +245,8 @@ public:
xf.eDy = ctm[SkMatrix::kMTransY];
SetWorldTransform(hdc, &xf);
- HRGN hrgn = CreateRectRgnIndirect(&toRECT(clip_bounds));
+ RECT clip_bounds_RECT = toRECT(clip_bounds);
+ HRGN hrgn = CreateRectRgnIndirect(&clip_bounds_RECT);
int result = SelectClipRgn(hdc, hrgn);
SkASSERT(result != ERROR);
result = DeleteObject(hrgn);
diff --git a/src/ports/SkImageEncoder_WIC.cpp b/src/ports/SkImageEncoder_WIC.cpp
index 1ae9257395..dc5160413f 100644
--- a/src/ports/SkImageEncoder_WIC.cpp
+++ b/src/ports/SkImageEncoder_WIC.cpp
@@ -159,7 +159,7 @@ bool SkEncodeImageWithWIC(SkWStream* stream, const SkPixmap& pixmap,
PROPBAG2 name = { 0 };
name.dwType = PROPBAG2_TYPE_DATA;
name.vt = VT_R4;
- name.pstrName = L"ImageQuality";
+ name.pstrName = const_cast<LPOLESTR>(L"ImageQuality");
VARIANT value;
VariantInit(&value);
diff --git a/src/utils/win/SkWGL_win.cpp b/src/utils/win/SkWGL_win.cpp
index d46123d1bf..cce7a56b75 100644
--- a/src/utils/win/SkWGL_win.cpp
+++ b/src/utils/win/SkWGL_win.cpp
@@ -229,7 +229,7 @@ void destroy_dummy_window(HWND dummy) {
}
#define GET_PROC(NAME, SUFFIX) f##NAME = \
- (##NAME##Proc) wglGetProcAddress("wgl" #NAME #SUFFIX)
+ (NAME##Proc) wglGetProcAddress("wgl" #NAME #SUFFIX)
SkWGLExtensions::SkWGLExtensions()
: fGetExtensionsString(nullptr)
diff --git a/src/views/win/SkOSWindow_win.cpp b/src/views/win/SkOSWindow_win.cpp
index 8be15d1d20..4c5f151c97 100644
--- a/src/views/win/SkOSWindow_win.cpp
+++ b/src/views/win/SkOSWindow_win.cpp
@@ -243,58 +243,6 @@ void SkOSWindow::onSetTitle(const char title[]){
SetWindowTextA((HWND)fHWND, title);
}
-enum {
- SK_MacReturnKey = 36,
- SK_MacDeleteKey = 51,
- SK_MacEndKey = 119,
- SK_MacLeftKey = 123,
- SK_MacRightKey = 124,
- SK_MacDownKey = 125,
- SK_MacUpKey = 126,
-
- SK_Mac0Key = 0x52,
- SK_Mac1Key = 0x53,
- SK_Mac2Key = 0x54,
- SK_Mac3Key = 0x55,
- SK_Mac4Key = 0x56,
- SK_Mac5Key = 0x57,
- SK_Mac6Key = 0x58,
- SK_Mac7Key = 0x59,
- SK_Mac8Key = 0x5b,
- SK_Mac9Key = 0x5c
-};
-
-static SkKey raw2key(uint32_t raw)
-{
- static const struct {
- uint32_t fRaw;
- SkKey fKey;
- } gKeys[] = {
- { SK_MacUpKey, kUp_SkKey },
- { SK_MacDownKey, kDown_SkKey },
- { SK_MacLeftKey, kLeft_SkKey },
- { SK_MacRightKey, kRight_SkKey },
- { SK_MacReturnKey, kOK_SkKey },
- { SK_MacDeleteKey, kBack_SkKey },
- { SK_MacEndKey, kEnd_SkKey },
- { SK_Mac0Key, k0_SkKey },
- { SK_Mac1Key, k1_SkKey },
- { SK_Mac2Key, k2_SkKey },
- { SK_Mac3Key, k3_SkKey },
- { SK_Mac4Key, k4_SkKey },
- { SK_Mac5Key, k5_SkKey },
- { SK_Mac6Key, k6_SkKey },
- { SK_Mac7Key, k7_SkKey },
- { SK_Mac8Key, k8_SkKey },
- { SK_Mac9Key, k9_SkKey }
- };
-
- for (unsigned i = 0; i < SK_ARRAY_COUNT(gKeys); i++)
- if (gKeys[i].fRaw == raw)
- return gKeys[i].fKey;
- return kNONE_SkKey;
-}
-
///////////////////////////////////////////////////////////////////////////////////////
void SkEvent::SignalNonEmptyQueue()
diff --git a/third_party/libwebp/BUILD.gn b/third_party/libwebp/BUILD.gn
index 7fec982e35..4ac2c5ef5c 100644
--- a/third_party/libwebp/BUILD.gn
+++ b/third_party/libwebp/BUILD.gn
@@ -17,15 +17,7 @@ if (skia_use_system_libwebp) {
]
}
} else {
- third_party("libwebp") {
- public_include_dirs = [ "../externals/libwebp/src" ]
-
- if (is_android) {
- deps = [
- "//third_party/cpu-features",
- ]
- }
-
+ config("libwebp_defines") {
defines = [
# WebP naturally decodes to RGB_565, and we work with BGR_565.
# This makes WebP decode to BGR_565 when we ask for RGB_565.
@@ -33,7 +25,49 @@ if (skia_use_system_libwebp) {
# TODO: swizzle ourself in SkWebpCodec instead of requiring this non-standard libwebp.
"WEBP_SWAP_16BIT_CSP",
]
+ }
+
+ third_party("libwebp_sse41") {
+ public_include_dirs = [ "../externals/libwebp/src" ]
+ configs += [ ":libwebp_defines" ]
+ sources = [
+ "../externals/libwebp/src/dsp/alpha_processing_sse41.c",
+ "../externals/libwebp/src/dsp/dec_sse41.c",
+ "../externals/libwebp/src/dsp/enc_sse41.c",
+ "../externals/libwebp/src/dsp/lossless_enc_sse41.c",
+ ]
+ if ((current_cpu == "x86" || current_cpu == "x64") &&
+ (!is_win || is_clang)) {
+ cflags_c = ["-msse4.1"]
+ }
+ }
+
+ third_party("libwebp_avx2") {
+ public_include_dirs = [ "../externals/libwebp/src" ]
+ configs += [ ":libwebp_defines" ]
+ sources = [
+ "../externals/libwebp/src/dsp/enc_avx2.c",
+ ]
+ if ((current_cpu == "x86" || current_cpu == "x64") &&
+ (!is_win || is_clang)) {
+ cflags_c = ["-mavx2"]
+ }
+ }
+
+ third_party("libwebp") {
+ public_include_dirs = [ "../externals/libwebp/src" ]
+
+ deps = [
+ ":libwebp_sse41",
+ ":libwebp_avx2",
+ ]
+ if (is_android) {
+ deps += [
+ "//third_party/cpu-features",
+ ]
+ }
+ configs += [ ":libwebp_defines" ]
sources = [
"../externals/libwebp/src/dec/alpha_dec.c",
"../externals/libwebp/src/dec/buffer_dec.c",
@@ -50,7 +84,6 @@ if (skia_use_system_libwebp) {
"../externals/libwebp/src/dsp/alpha_processing_mips_dsp_r2.c",
"../externals/libwebp/src/dsp/alpha_processing_neon.c",
"../externals/libwebp/src/dsp/alpha_processing_sse2.c",
- "../externals/libwebp/src/dsp/alpha_processing_sse41.c",
"../externals/libwebp/src/dsp/argb.c",
"../externals/libwebp/src/dsp/argb_mips_dsp_r2.c",
"../externals/libwebp/src/dsp/argb_sse2.c",
@@ -65,15 +98,12 @@ if (skia_use_system_libwebp) {
"../externals/libwebp/src/dsp/dec_mips_dsp_r2.c",
"../externals/libwebp/src/dsp/dec_neon.c",
"../externals/libwebp/src/dsp/dec_sse2.c",
- "../externals/libwebp/src/dsp/dec_sse41.c",
"../externals/libwebp/src/dsp/enc.c",
- "../externals/libwebp/src/dsp/enc_avx2.c",
"../externals/libwebp/src/dsp/enc_mips32.c",
"../externals/libwebp/src/dsp/enc_mips_dsp_r2.c",
"../externals/libwebp/src/dsp/enc_msa.c",
"../externals/libwebp/src/dsp/enc_neon.c",
"../externals/libwebp/src/dsp/enc_sse2.c",
- "../externals/libwebp/src/dsp/enc_sse41.c",
"../externals/libwebp/src/dsp/filters.c",
"../externals/libwebp/src/dsp/filters_mips_dsp_r2.c",
"../externals/libwebp/src/dsp/filters_msa.c",
@@ -86,7 +116,6 @@ if (skia_use_system_libwebp) {
"../externals/libwebp/src/dsp/lossless_enc_msa.c",
"../externals/libwebp/src/dsp/lossless_enc_neon.c",
"../externals/libwebp/src/dsp/lossless_enc_sse2.c",
- "../externals/libwebp/src/dsp/lossless_enc_sse41.c",
"../externals/libwebp/src/dsp/lossless_mips_dsp_r2.c",
"../externals/libwebp/src/dsp/lossless_msa.c",
"../externals/libwebp/src/dsp/lossless_neon.c",
diff --git a/third_party/zlib/BUILD.gn b/third_party/zlib/BUILD.gn
index 3f9bc5c7c8..a1e4836bf6 100644
--- a/third_party/zlib/BUILD.gn
+++ b/third_party/zlib/BUILD.gn
@@ -48,7 +48,7 @@ third_party("zlib_x86") {
"../externals/zlib/fill_window_sse.c",
"../externals/zlib/x86.c",
]
- if (!is_win) {
+ if (!is_win || is_clang) {
cflags_c = [
"-msse4.2",
"-mpclmul",
diff --git a/tools/colorspaceinfo.cpp b/tools/colorspaceinfo.cpp
index c35e735d8c..8250a03bcb 100644
--- a/tools/colorspaceinfo.cpp
+++ b/tools/colorspaceinfo.cpp
@@ -476,7 +476,7 @@ int main(int argc, char** argv) {
{
SkColorSpaceTransferFn colorSpaceTransferFn;
- SkMatrix44 toXYZD50;
+ SkMatrix44 toXYZD50(SkMatrix44::kIdentity_Constructor);
if (colorSpace->isNumericalTransferFn(&colorSpaceTransferFn) &&
colorSpace->toXYZD50(&toXYZD50)) {
SkString description = SkICCGetColorProfileTag(colorSpaceTransferFn, toXYZD50);
diff --git a/tools/sk_tool_utils.cpp b/tools/sk_tool_utils.cpp
index 47f4aae397..d957d53f12 100644
--- a/tools/sk_tool_utils.cpp
+++ b/tools/sk_tool_utils.cpp
@@ -369,7 +369,7 @@ void create_tetra_normal_map(SkBitmap* bm, const SkIRect& dst) {
}
}
-#if defined(_MSC_VER)
+#if !defined(__clang__) && defined(_MSC_VER)
// MSVC takes ~2 minutes to compile this function with optimization.
// We don't really care to wait that long for this function.
#pragma optimize("", off)
diff --git a/tools/viewer/Viewer.cpp b/tools/viewer/Viewer.cpp
index 6f01f2df01..9e941f4dcf 100644
--- a/tools/viewer/Viewer.cpp
+++ b/tools/viewer/Viewer.cpp
@@ -729,7 +729,7 @@ void Viewer::drawSlide(SkCanvas* canvas) {
if (ColorMode::kLegacy != fColorMode) {
auto transferFn = (ColorMode::kColorManagedLinearF16 == fColorMode)
? SkColorSpace::kLinear_RenderTargetGamma : SkColorSpace::kSRGB_RenderTargetGamma;
- SkMatrix44 toXYZ;
+ SkMatrix44 toXYZ(SkMatrix44::kIdentity_Constructor);
SkAssertResult(fColorSpacePrimaries.toXYZD50(&toXYZ));
cs = SkColorSpace::MakeRGB(transferFn, toXYZ);
}