This is because with the addition of new features to Cycles, these GPUs experienced significant performance regressions and bugs, all stemming from bugs in the Metal GPU driver/compiler. The only reasonable way to work around these issues was to disable parts of Cycles code on these GPUs to avoid the driver/compiler bugs. This resulted in increased development time maintaining these platforms while being unable to deliver feature parity with other GPU backends. It has been decided that this development time is better spent maintaining platforms that are still actively maintained by hardware/software vendors, and so AMD and Intel GPU support will be removed from the Metal backend for Cycles. Pull Request: https://projects.blender.org/blender/blender/pulls/123551
77 lines
2.6 KiB
C++
77 lines
2.6 KiB
C++
/* SPDX-FileCopyrightText: 2021-2022 Blender Foundation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0 */
|
|
|
|
// clang-format off
|
|
|
|
#ifdef WITH_NANOVDB
|
|
# include "kernel/util/nanovdb.h"
|
|
#endif
|
|
|
|
/* Open the Metal kernel context class
|
|
* Necessary to access resource bindings */
|
|
class MetalKernelContext {
|
|
public:
|
|
constant KernelParamsMetal &launch_params_metal;
|
|
constant MetalAncillaries *metal_ancillaries;
|
|
|
|
MetalKernelContext(constant KernelParamsMetal &_launch_params_metal, constant MetalAncillaries * _metal_ancillaries)
|
|
: launch_params_metal(_launch_params_metal), metal_ancillaries(_metal_ancillaries)
|
|
{}
|
|
|
|
MetalKernelContext(constant KernelParamsMetal &_launch_params_metal)
|
|
: launch_params_metal(_launch_params_metal)
|
|
{}
|
|
|
|
/* texture fetch adapter functions */
|
|
typedef uint64_t ccl_gpu_tex_object_2D;
|
|
typedef uint64_t ccl_gpu_tex_object_3D;
|
|
|
|
template<typename T>
|
|
inline __attribute__((__always_inline__))
|
|
T ccl_gpu_tex_object_read_2D(ccl_gpu_tex_object_2D tex, float x, float y) const {
|
|
kernel_assert(0);
|
|
return 0;
|
|
}
|
|
template<typename T>
|
|
inline __attribute__((__always_inline__))
|
|
T ccl_gpu_tex_object_read_3D(ccl_gpu_tex_object_3D tex, float x, float y, float z) const {
|
|
kernel_assert(0);
|
|
return 0;
|
|
}
|
|
|
|
// texture2d
|
|
template<>
|
|
inline __attribute__((__always_inline__))
|
|
float4 ccl_gpu_tex_object_read_2D(ccl_gpu_tex_object_2D tex, float x, float y) const {
|
|
const uint tid(tex);
|
|
const uint sid(tex >> 32);
|
|
return metal_ancillaries->textures_2d[tid].tex.sample(metal_samplers[sid], float2(x, y));
|
|
}
|
|
template<>
|
|
inline __attribute__((__always_inline__))
|
|
float ccl_gpu_tex_object_read_2D(ccl_gpu_tex_object_2D tex, float x, float y) const {
|
|
const uint tid(tex);
|
|
const uint sid(tex >> 32);
|
|
return metal_ancillaries->textures_2d[tid].tex.sample(metal_samplers[sid], float2(x, y)).x;
|
|
}
|
|
|
|
// texture3d
|
|
template<>
|
|
inline __attribute__((__always_inline__))
|
|
float4 ccl_gpu_tex_object_read_3D(ccl_gpu_tex_object_3D tex, float x, float y, float z) const {
|
|
const uint tid(tex);
|
|
const uint sid(tex >> 32);
|
|
return metal_ancillaries->textures_3d[tid].tex.sample(metal_samplers[sid], float3(x, y, z));
|
|
}
|
|
template<>
|
|
inline __attribute__((__always_inline__))
|
|
float ccl_gpu_tex_object_read_3D(ccl_gpu_tex_object_3D tex, float x, float y, float z) const {
|
|
const uint tid(tex);
|
|
const uint sid(tex >> 32);
|
|
return metal_ancillaries->textures_3d[tid].tex.sample(metal_samplers[sid], float3(x, y, z)).x;
|
|
}
|
|
# include "kernel/device/gpu/image.h"
|
|
|
|
// clang-format on
|