v2: rework arguments to compiler::compile_program add assert to device::ir_format
Signed-off-by: Karol Herbst <kher...@redhat.com> Reviewed-by: Francisco Jerez <curroje...@riseup.net> --- src/gallium/include/pipe/p_defines.h | 1 + .../state_trackers/clover/core/compiler.hpp | 68 +++++++++++++++++++ .../state_trackers/clover/core/device.cpp | 21 ++++-- .../state_trackers/clover/core/program.cpp | 10 ++- src/gallium/state_trackers/clover/meson.build | 1 + 5 files changed, 89 insertions(+), 12 deletions(-) create mode 100644 src/gallium/state_trackers/clover/core/compiler.hpp diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index e59a92ea529..90ee1427eb3 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -986,6 +986,7 @@ enum pipe_shader_ir PIPE_SHADER_IR_TGSI = 0, PIPE_SHADER_IR_NATIVE, PIPE_SHADER_IR_NIR, + PIPE_SHADER_IR_SPIRV, }; /** diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp b/src/gallium/state_trackers/clover/core/compiler.hpp new file mode 100644 index 00000000000..96004459e14 --- /dev/null +++ b/src/gallium/state_trackers/clover/core/compiler.hpp @@ -0,0 +1,68 @@ +// +// Copyright 2019 Red Hat, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// + +#ifndef CLOVER_CORE_COMPILER_HPP +#define CLOVER_CORE_COMPILER_HPP + +#include "core/device.hpp" +#include "core/module.hpp" +#include "llvm/invocation.hpp" +#include "spirv/invocation.hpp" + +namespace clover { + namespace compiler { + static inline module + compile_program(const std::string &source, const header_map &headers, + const device &dev, const std::string &opts, + std::string &log) { + switch (dev.ir_format()) { +#ifdef CLOVER_ALLOW_SPIRV + case PIPE_SHADER_IR_SPIRV: + return llvm::compile_to_spirv(source, headers, dev, opts, log); +#endif + case PIPE_SHADER_IR_NATIVE: + return llvm::compile_program(source, headers, dev, opts, log); + default: + unreachable("device with unsupported IR"); + throw error(CL_INVALID_VALUE); + } + } + + static inline module + link_program(const std::vector<module> &ms, const device &dev, + const std::string &opts, std::string &log) { + switch (dev.ir_format()) { +#ifdef CLOVER_ALLOW_SPIRV + case PIPE_SHADER_IR_SPIRV: + return spirv::link_program(ms, dev, opts, log); +#endif + case PIPE_SHADER_IR_NATIVE: + return llvm::link_program(ms, dev, opts, log); + default: + unreachable("device with unsupported IR"); + throw error(CL_INVALID_VALUE); + } + } + } +} + +#endif diff --git a/src/gallium/state_trackers/clover/core/device.cpp b/src/gallium/state_trackers/clover/core/device.cpp index de635454857..417a048b4db 100644 --- a/src/gallium/state_trackers/clover/core/device.cpp +++ b/src/gallium/state_trackers/clover/core/device.cpp @@ -45,12 +45,17 @@ namespace { device::device(clover::platform &platform, pipe_loader_device *ldev) : platform(platform), ldev(ldev) { pipe = pipe_loader_create_screen(ldev); - if (!pipe || !pipe->get_param(pipe, PIPE_CAP_COMPUTE) || - !supports_ir(PIPE_SHADER_IR_NATIVE)) { - if (pipe) - pipe->destroy(pipe); - throw error(CL_INVALID_DEVICE); + if (pipe && pipe->get_param(pipe, PIPE_CAP_COMPUTE)) { + if (supports_ir(PIPE_SHADER_IR_NATIVE)) + return; +#ifdef CLOVER_ALLOW_SPIRV + if (supports_ir(PIPE_SHADER_IR_SPIRV)) + return; +#endif } + if (pipe) + pipe->destroy(pipe); + throw error(CL_INVALID_DEVICE); } device::~device() { @@ -245,7 +250,11 @@ device::vendor_name() const { enum pipe_shader_ir device::ir_format() const { - return PIPE_SHADER_IR_NATIVE; + if (supports_ir(PIPE_SHADER_IR_NATIVE)) + return PIPE_SHADER_IR_NATIVE; + + assert(supports_ir(PIPE_SHADER_IR_SPIRV)); + return PIPE_SHADER_IR_SPIRV; } std::string diff --git a/src/gallium/state_trackers/clover/core/program.cpp b/src/gallium/state_trackers/clover/core/program.cpp index 62fa13efbf9..526e06a26c3 100644 --- a/src/gallium/state_trackers/clover/core/program.cpp +++ b/src/gallium/state_trackers/clover/core/program.cpp @@ -20,8 +20,8 @@ // OTHER DEALINGS IN THE SOFTWARE. // +#include "core/compiler.hpp" #include "core/program.hpp" -#include "llvm/invocation.hpp" using namespace clover; @@ -51,9 +51,8 @@ program::compile(const ref_vector<device> &devs, const std::string &opts, std::string log; try { - assert(dev.ir_format() == PIPE_SHADER_IR_NATIVE); - const module m = llvm::compile_program(_source, headers, dev, opts, - log); + const module m = + compiler::compile_program(_source, headers, dev, opts, log); _builds[&dev] = { m, opts, log }; } catch (...) { _builds[&dev] = { module(), opts, log }; @@ -75,8 +74,7 @@ program::link(const ref_vector<device> &devs, const std::string &opts, std::string log = _builds[&dev].log; try { - assert(dev.ir_format() == PIPE_SHADER_IR_NATIVE); - const module m = llvm::link_program(ms, dev, opts, log); + const module m = compiler::link_program(ms, dev, opts, log); _builds[&dev] = { m, opts, log }; } catch (...) { _builds[&dev] = { module(), opts, log }; diff --git a/src/gallium/state_trackers/clover/meson.build b/src/gallium/state_trackers/clover/meson.build index 4cd4012fd10..5970b1ac6b3 100644 --- a/src/gallium/state_trackers/clover/meson.build +++ b/src/gallium/state_trackers/clover/meson.build @@ -81,6 +81,7 @@ clover_files = files( 'api/sampler.cpp', 'api/transfer.cpp', 'api/util.hpp', + 'core/compiler.hpp', 'core/context.cpp', 'core/context.hpp', 'core/device.cpp', -- 2.21.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev