Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2020-05-18 19:16:10 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2020-05-27 13:07:15 +0300
commit7c0bea0d656eb4838ae2b5ebfed53cd1dae6cb12 (patch)
treea9b58585fc24289fd06c69e71ee5e36ad16dd3ac /intern/opensubdiv
parente490dc4346dba5f29dada59ef421dfff499d65a9 (diff)
OpenSubdiv: Refactor, move device specific code to own files
Also, move all device files to own folder. Makes it so checks for device availability are done in a localized place.
Diffstat (limited to 'intern/opensubdiv')
-rw-r--r--intern/opensubdiv/CMakeLists.txt36
-rw-r--r--intern/opensubdiv/internal/device/device_context_cuda.cc39
-rw-r--r--intern/opensubdiv/internal/device/device_context_cuda.h38
-rw-r--r--intern/opensubdiv/internal/device/device_context_glsl_compute.cc40
-rw-r--r--intern/opensubdiv/internal/device/device_context_glsl_compute.h38
-rw-r--r--intern/opensubdiv/internal/device/device_context_glsl_transform_feedback.cc40
-rw-r--r--intern/opensubdiv/internal/device/device_context_glsl_transform_feedback.h38
-rw-r--r--intern/opensubdiv/internal/device/device_context_opencl.cc39
-rw-r--r--intern/opensubdiv/internal/device/device_context_opencl.h38
-rw-r--r--intern/opensubdiv/internal/device/device_context_openmp.cc42
-rw-r--r--intern/opensubdiv/internal/device/device_context_openmp.h38
-rw-r--r--intern/opensubdiv/internal/opensubdiv.cc35
-rw-r--r--intern/opensubdiv/internal/opensubdiv_device_context_cuda.cc234
-rw-r--r--intern/opensubdiv/internal/opensubdiv_device_context_cuda.h54
-rw-r--r--intern/opensubdiv/internal/opensubdiv_device_context_opencl.cc258
-rw-r--r--intern/opensubdiv/internal/opensubdiv_device_context_opencl.h52
16 files changed, 420 insertions, 639 deletions
diff --git a/intern/opensubdiv/CMakeLists.txt b/intern/opensubdiv/CMakeLists.txt
index 13565a6ed28..3226d9e8931 100644
--- a/intern/opensubdiv/CMakeLists.txt
+++ b/intern/opensubdiv/CMakeLists.txt
@@ -50,11 +50,20 @@ if(WITH_OPENSUBDIV)
)
list(APPEND SRC
+ internal/device/device_context_cuda.cc
+ internal/device/device_context_cuda.h
+ internal/device/device_context_glsl_compute.cc
+ internal/device/device_context_glsl_compute.h
+ internal/device/device_context_glsl_transform_feedback.cc
+ internal/device/device_context_glsl_transform_feedback.h
+ internal/device/device_context_opencl.cc
+ internal/device/device_context_opencl.h
+ internal/device/device_context_openmp.cc
+ internal/device/device_context_openmp.h
+
internal/opensubdiv.cc
internal/opensubdiv_converter_factory.cc
internal/opensubdiv_converter_internal.cc
- internal/opensubdiv_device_context_cuda.cc
- internal/opensubdiv_device_context_opencl.cc
internal/opensubdiv_evaluator.cc
internal/opensubdiv_evaluator_internal.cc
internal/opensubdiv_topology_refiner.cc
@@ -63,8 +72,6 @@ if(WITH_OPENSUBDIV)
internal/opensubdiv_converter_factory.h
internal/opensubdiv_converter_internal.h
- internal/opensubdiv_device_context_cuda.h
- internal/opensubdiv_device_context_opencl.h
internal/opensubdiv_edge_map.h
internal/opensubdiv_evaluator_internal.h
internal/opensubdiv_internal.h
@@ -83,10 +90,8 @@ if(WITH_OPENSUBDIV)
endif()
OPENSUBDIV_DEFINE_COMPONENT(OPENSUBDIV_HAS_OPENMP)
- # TODO(sergey): OpenCL is not tested and totally unstable atm.
- # OPENSUBDIV_DEFINE_COMPONENT(OPENSUBDIV_HAS_OPENCL)
- # TODO(sergey): CUDA stays disabled for util it's ported to drievr API.
- # OPENSUBDIV_DEFINE_COMPONENT(OPENSUBDIV_HAS_CUDA)
+ OPENSUBDIV_DEFINE_COMPONENT(OPENSUBDIV_HAS_OPENCL)
+ OPENSUBDIV_DEFINE_COMPONENT(OPENSUBDIV_HAS_CUDA)
OPENSUBDIV_DEFINE_COMPONENT(OPENSUBDIV_HAS_GLSL_TRANSFORM_FEEDBACK)
OPENSUBDIV_DEFINE_COMPONENT(OPENSUBDIV_HAS_GLSL_COMPUTE)
@@ -97,21 +102,6 @@ if(WITH_OPENSUBDIV)
add_definitions(-DNOMINMAX)
add_definitions(-D_USE_MATH_DEFINES)
endif()
-
- # TODO(sergey): Put CUEW back when CUDA is officially supported by OSD.
- # if(OPENSUBDIV_HAS_CUDA)
- # list(APPEND INC
- # ../../extern/cuew/include
- # )
- # add_definitions(-DOPENSUBDIV_HAS_CUEW)
- # endif()
-
- if(OPENSUBDIV_HAS_OPENCL)
- list(APPEND INC
- ../../extern/clew/include
- )
- add_definitions(-DOPENSUBDIV_HAS_CLEW)
- endif()
else()
list(APPEND SRC
stub/opensubdiv_stub.cc
diff --git a/intern/opensubdiv/internal/device/device_context_cuda.cc b/intern/opensubdiv/internal/device/device_context_cuda.cc
new file mode 100644
index 00000000000..cd4336265a5
--- /dev/null
+++ b/intern/opensubdiv/internal/device/device_context_cuda.cc
@@ -0,0 +1,39 @@
+// Copyright 2020 Blender Foundation. All rights reserved.
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation,
+// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// Author: Sergey Sharybin
+
+#include "internal/device/device_context_cuda.h"
+
+namespace blender {
+namespace opensubdiv {
+
+bool CUDADeviceContext::isSupported()
+{
+ // TODO(sergey): Add CUDA device support, using CUDA-RT API.
+ return false;
+}
+
+CUDADeviceContext::CUDADeviceContext()
+{
+}
+
+CUDADeviceContext::~CUDADeviceContext()
+{
+}
+
+} // namespace opensubdiv
+} // namespace blender
diff --git a/intern/opensubdiv/internal/device/device_context_cuda.h b/intern/opensubdiv/internal/device/device_context_cuda.h
new file mode 100644
index 00000000000..d1bfb15fbcb
--- /dev/null
+++ b/intern/opensubdiv/internal/device/device_context_cuda.h
@@ -0,0 +1,38 @@
+// Copyright 2020 Blender Foundation. All rights reserved.
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation,
+// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// Author: Sergey Sharybin
+
+#ifndef OPENSUBDIV_DEVICE_CONTEXT_CUDA_H_
+#define OPENSUBDIV_DEVICE_CONTEXT_CUDA_H_
+
+namespace blender {
+namespace opensubdiv {
+
+class CUDADeviceContext {
+ public:
+ // Stateless check to see whether CUDA functionality is available on this
+ // platform.
+ static bool isSupported();
+
+ CUDADeviceContext();
+ ~CUDADeviceContext();
+};
+
+} // namespace opensubdiv
+} // namespace blender
+
+#endif // _OPENSUBDIV_DEVICE_CONTEXT_CUDA_H_
diff --git a/intern/opensubdiv/internal/device/device_context_glsl_compute.cc b/intern/opensubdiv/internal/device/device_context_glsl_compute.cc
new file mode 100644
index 00000000000..7b416976099
--- /dev/null
+++ b/intern/opensubdiv/internal/device/device_context_glsl_compute.cc
@@ -0,0 +1,40 @@
+// Copyright 2020 Blender Foundation. All rights reserved.
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation,
+// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// Author: Sergey Sharybin
+
+#include "internal/device/device_context_glsl_compute.h"
+
+#include <GL/glew.h>
+
+namespace blender {
+namespace opensubdiv {
+
+bool GLSLComputeDeviceContext::isSupported()
+{
+ return GLEW_VERSION_4_3 || GLEW_ARB_compute_shader;
+}
+
+GLSLComputeDeviceContext::GLSLComputeDeviceContext()
+{
+}
+
+GLSLComputeDeviceContext::~GLSLComputeDeviceContext()
+{
+}
+
+} // namespace opensubdiv
+} // namespace blender
diff --git a/intern/opensubdiv/internal/device/device_context_glsl_compute.h b/intern/opensubdiv/internal/device/device_context_glsl_compute.h
new file mode 100644
index 00000000000..f64c7d1954b
--- /dev/null
+++ b/intern/opensubdiv/internal/device/device_context_glsl_compute.h
@@ -0,0 +1,38 @@
+// Copyright 2020 Blender Foundation. All rights reserved.
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation,
+// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// Author: Sergey Sharybin
+
+#ifndef OPENSUBDIV_DEVICE_CONTEXT_GLSL_COMPUTE_H_
+#define OPENSUBDIV_DEVICE_CONTEXT_GLSL_COMPUTE_H_
+
+namespace blender {
+namespace opensubdiv {
+
+class GLSLComputeDeviceContext {
+ public:
+ // Stateless check to see whether GLSL compute functionality is
+ // available on this platform.
+ static bool isSupported();
+
+ GLSLComputeDeviceContext();
+ ~GLSLComputeDeviceContext();
+};
+
+} // namespace opensubdiv
+} // namespace blender
+
+#endif // _OPENSUBDIV_DEVICE_CONTEXT_GLSL_COMPUTE_H_
diff --git a/intern/opensubdiv/internal/device/device_context_glsl_transform_feedback.cc b/intern/opensubdiv/internal/device/device_context_glsl_transform_feedback.cc
new file mode 100644
index 00000000000..ef897608b6e
--- /dev/null
+++ b/intern/opensubdiv/internal/device/device_context_glsl_transform_feedback.cc
@@ -0,0 +1,40 @@
+// Copyright 2020 Blender Foundation. All rights reserved.
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation,
+// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// Author: Sergey Sharybin
+
+#include "internal/device/device_context_glsl_transform_feedback.h"
+
+#include <GL/glew.h>
+
+namespace blender {
+namespace opensubdiv {
+
+bool GLSLTransformFeedbackDeviceContext::isSupported()
+{
+ return GLEW_VERSION_4_1;
+}
+
+GLSLTransformFeedbackDeviceContext::GLSLTransformFeedbackDeviceContext()
+{
+}
+
+GLSLTransformFeedbackDeviceContext::~GLSLTransformFeedbackDeviceContext()
+{
+}
+
+} // namespace opensubdiv
+} // namespace blender
diff --git a/intern/opensubdiv/internal/device/device_context_glsl_transform_feedback.h b/intern/opensubdiv/internal/device/device_context_glsl_transform_feedback.h
new file mode 100644
index 00000000000..7bbbba1380f
--- /dev/null
+++ b/intern/opensubdiv/internal/device/device_context_glsl_transform_feedback.h
@@ -0,0 +1,38 @@
+// Copyright 2020 Blender Foundation. All rights reserved.
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation,
+// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// Author: Sergey Sharybin
+
+#ifndef OPENSUBDIV_DEVICE_CONTEXT_GLSL_TRANSFORM_FEEDBACK_H_
+#define OPENSUBDIV_DEVICE_CONTEXT_GLSL_TRANSFORM_FEEDBACK_H_
+
+namespace blender {
+namespace opensubdiv {
+
+class GLSLTransformFeedbackDeviceContext {
+ public:
+ // Stateless check to see whether GLSL transform feedback functionality is
+ // available on this platform.
+ static bool isSupported();
+
+ GLSLTransformFeedbackDeviceContext();
+ ~GLSLTransformFeedbackDeviceContext();
+};
+
+} // namespace opensubdiv
+} // namespace blender
+
+#endif // _OPENSUBDIV_DEVICE_CONTEXT_GLSL_TRANSFORM_FEEDBACK_H_
diff --git a/intern/opensubdiv/internal/device/device_context_opencl.cc b/intern/opensubdiv/internal/device/device_context_opencl.cc
new file mode 100644
index 00000000000..1670ea3c9d0
--- /dev/null
+++ b/intern/opensubdiv/internal/device/device_context_opencl.cc
@@ -0,0 +1,39 @@
+// Copyright 2020 Blender Foundation. All rights reserved.
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation,
+// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// Author: Sergey Sharybin
+
+#include "internal/device/device_context_opencl.h"
+
+namespace blender {
+namespace opensubdiv {
+
+bool OpenCLDeviceContext::isSupported()
+{
+ // TODO(sergey): Add support of OpenCL devices.
+ return false;
+}
+
+OpenCLDeviceContext::OpenCLDeviceContext()
+{
+}
+
+OpenCLDeviceContext::~OpenCLDeviceContext()
+{
+}
+
+} // namespace opensubdiv
+} // namespace blender
diff --git a/intern/opensubdiv/internal/device/device_context_opencl.h b/intern/opensubdiv/internal/device/device_context_opencl.h
new file mode 100644
index 00000000000..57ec6ed3bb6
--- /dev/null
+++ b/intern/opensubdiv/internal/device/device_context_opencl.h
@@ -0,0 +1,38 @@
+// Copyright 2020 Blender Foundation. All rights reserved.
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation,
+// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// Author: Sergey Sharybin
+
+#ifndef OPENSUBDIV_DEVICE_CONTEXT_OPENCL_H_
+#define OPENSUBDIV_DEVICE_CONTEXT_OPENCL_H_
+
+namespace blender {
+namespace opensubdiv {
+
+class OpenCLDeviceContext {
+ public:
+ // Stateless check to see whether OpenCL functionality is available on this
+ // platform.
+ static bool isSupported();
+
+ OpenCLDeviceContext();
+ ~OpenCLDeviceContext();
+};
+
+} // namespace opensubdiv
+} // namespace blender
+
+#endif // _OPENSUBDIV_DEVICE_CONTEXT_OPENCL_H_
diff --git a/intern/opensubdiv/internal/device/device_context_openmp.cc b/intern/opensubdiv/internal/device/device_context_openmp.cc
new file mode 100644
index 00000000000..e01312fefaf
--- /dev/null
+++ b/intern/opensubdiv/internal/device/device_context_openmp.cc
@@ -0,0 +1,42 @@
+// Copyright 2020 Blender Foundation. All rights reserved.
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation,
+// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// Author: Sergey Sharybin
+
+#include "internal/device/device_context_openmp.h"
+
+namespace blender {
+namespace opensubdiv {
+
+bool OpenMPDeviceContext::isSupported()
+{
+#ifdef OPENSUBDIV_HAS_OPENMP
+ return true;
+#else
+ return false;
+#endif
+}
+
+OpenMPDeviceContext::OpenMPDeviceContext()
+{
+}
+
+OpenMPDeviceContext::~OpenMPDeviceContext()
+{
+}
+
+} // namespace opensubdiv
+} // namespace blender
diff --git a/intern/opensubdiv/internal/device/device_context_openmp.h b/intern/opensubdiv/internal/device/device_context_openmp.h
new file mode 100644
index 00000000000..2bebbdf40bc
--- /dev/null
+++ b/intern/opensubdiv/internal/device/device_context_openmp.h
@@ -0,0 +1,38 @@
+// Copyright 2020 Blender Foundation. All rights reserved.
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation,
+// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// Author: Sergey Sharybin
+
+#ifndef OPENSUBDIV_DEVICE_CONTEXT_OPENMP_H_
+#define OPENSUBDIV_DEVICE_CONTEXT_OPENMP_H_
+
+namespace blender {
+namespace opensubdiv {
+
+class OpenMPDeviceContext {
+ public:
+ // Stateless check to see whether OpenMP functionality is available on this
+ // platform.
+ static bool isSupported();
+
+ OpenMPDeviceContext();
+ ~OpenMPDeviceContext();
+};
+
+} // namespace opensubdiv
+} // namespace blender
+
+#endif // _OPENSUBDIV_DEVICE_CONTEXT_OPENMP_H_
diff --git a/intern/opensubdiv/internal/opensubdiv.cc b/intern/opensubdiv/internal/opensubdiv.cc
index e9f6086851b..1d0f23f3046 100644
--- a/intern/opensubdiv/internal/opensubdiv.cc
+++ b/intern/opensubdiv/internal/opensubdiv.cc
@@ -20,10 +20,17 @@
# include <iso646.h>
#endif
-#include <GL/glew.h>
+#include "internal/device/device_context_cuda.h"
+#include "internal/device/device_context_glsl_compute.h"
+#include "internal/device/device_context_glsl_transform_feedback.h"
+#include "internal/device/device_context_opencl.h"
+#include "internal/device/device_context_openmp.h"
-#include "opensubdiv_device_context_cuda.h"
-#include "opensubdiv_device_context_opencl.h"
+using blender::opensubdiv::CUDADeviceContext;
+using blender::opensubdiv::GLSLComputeDeviceContext;
+using blender::opensubdiv::GLSLTransformFeedbackDeviceContext;
+using blender::opensubdiv::OpenCLDeviceContext;
+using blender::opensubdiv::OpenMPDeviceContext;
void openSubdiv_init(void)
{
@@ -39,33 +46,25 @@ int openSubdiv_getAvailableEvaluators(void)
{
int flags = OPENSUBDIV_EVALUATOR_CPU;
-#ifdef OPENSUBDIV_HAS_OPENMP
- flags |= OPENSUBDIV_EVALUATOR_OPENMP;
-#endif
+ if (OpenMPDeviceContext::isSupported()) {
+ flags |= OPENSUBDIV_EVALUATOR_OPENMP;
+ }
-#ifdef OPENSUBDIV_HAS_OPENCL
- if (CLDeviceContext::HAS_CL_VERSION_1_1()) {
+ if (OpenCLDeviceContext::isSupported()) {
flags |= OPENSUBDIV_EVALUATOR_OPENCL;
}
-#endif
-#ifdef OPENSUBDIV_HAS_CUDA
- if (CudaDeviceContext::HAS_CUDA_VERSION_4_0()) {
+ if (CUDADeviceContext::isSupported()) {
flags |= OPENSUBDIV_EVALUATOR_CUDA;
}
-#endif
-#ifdef OPENSUBDIV_HAS_GLSL_TRANSFORM_FEEDBACK
- if (GLEW_VERSION_4_1) {
+ if (GLSLTransformFeedbackDeviceContext::isSupported()) {
flags |= OPENSUBDIV_EVALUATOR_GLSL_TRANSFORM_FEEDBACK;
}
-#endif
-#ifdef OPENSUBDIV_HAS_GLSL_COMPUTE
- if (GLEW_VERSION_4_3 || GLEW_ARB_compute_shader) {
+ if (GLSLComputeDeviceContext::isSupported()) {
flags |= OPENSUBDIV_EVALUATOR_GLSL_COMPUTE;
}
-#endif
return flags;
}
diff --git a/intern/opensubdiv/internal/opensubdiv_device_context_cuda.cc b/intern/opensubdiv/internal/opensubdiv_device_context_cuda.cc
deleted file mode 100644
index c0355ab24a8..00000000000
--- a/intern/opensubdiv/internal/opensubdiv_device_context_cuda.cc
+++ /dev/null
@@ -1,234 +0,0 @@
-// Adopted from OpenSubdiv with the following license:
-//
-// Copyright 2015 Pixar
-//
-// Licensed under the Apache License, Version 2.0 (the "Apache License")
-// with the following modification; you may not use this file except in
-// compliance with the Apache License and the following modification to it:
-// Section 6. Trademarks. is deleted and replaced with:
-//
-// 6. Trademarks. This License does not grant permission to use the trade
-// names, trademarks, service marks, or product names of the Licensor
-// and its affiliates, except as required to comply with Section 4(c) of
-// the License and to reproduce the content of the NOTICE file.
-//
-// You may obtain a copy of the Apache License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the Apache License with the above modification is
-// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the Apache License for the specific
-// language governing permissions and limitations under the Apache License.
-
-#ifdef OPENSUBDIV_HAS_CUDA
-
-# ifdef _MSC_VER
-# include <iso646.h>
-# endif
-
-# include "opensubdiv_device_context_cuda.h"
-
-# if defined(_WIN32)
-# include <windows.h>
-# elif defined(__APPLE__)
-# include <OpenGL/OpenGL.h>
-# else
-# include <GL/glx.h>
-# include <X11/Xlib.h>
-# endif
-
-# include <cstdio>
-# include <cuda.h>
-# include <cuda_gl_interop.h>
-# include <cuda_runtime_api.h>
-
-# include "internal/opensubdiv_util.h"
-
-# define message(fmt, ...)
-// #define message(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__)
-# define error(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__)
-
-namespace {
-
-int getCudaDeviceForCurrentGLContext()
-{
- // Find and use the CUDA device for the current GL context
- unsigned int interop_device_count = 0;
- int interopDevices[1];
- cudaError_t status = cudaGLGetDevices(
- &interop_device_count, interopDevices, 1, cudaGLDeviceListCurrentFrame);
- if (status == cudaErrorNoDevice || interop_device_count != 1) {
- message("CUDA no interop devices found.\n");
- return 0;
- }
- int device = interopDevices[0];
-# if defined(_WIN32)
- return device;
-# elif defined(__APPLE__)
- return device;
-# else // X11
- Display *display = glXGetCurrentDisplay();
- int screen = DefaultScreen(display);
- if (device != screen) {
- error(
- "The CUDA interop device (%d) does not match "
- "the screen used by the current GL context (%d), "
- "which may cause slow performance on systems "
- "with multiple GPU devices.",
- device,
- screen);
- }
- message("CUDA init using device for current GL context: %d\n", device);
- return device;
-# endif
-}
-
-// Beginning of GPU Architecture definitions.
-int convertSMVer2Cores_local(int major, int minor)
-{
- // Defines for GPU Architecture types (using the SM version to determine
- // the # of cores per SM
- typedef struct {
- int SM; // 0xMm (hexidecimal notation),
- // M = SM Major version,
- // and m = SM minor version
- int Cores;
- } sSMtoCores;
-
- sSMtoCores nGpuArchCoresPerSM[] = {{0x10, 8}, // Tesla Generation (SM 1.0) G80 class.
- {0x11, 8}, // Tesla Generation (SM 1.1) G8x class.
- {0x12, 8}, // Tesla Generation (SM 1.2) G9x class.
- {0x13, 8}, // Tesla Generation (SM 1.3) GT200 class.
- {0x20, 32}, // Fermi Generation (SM 2.0) GF100 class.
- {0x21, 48}, // Fermi Generation (SM 2.1) GF10x class.
- {0x30, 192}, // Fermi Generation (SM 3.0) GK10x class.
- {-1, -1}};
- int index = 0;
- while (nGpuArchCoresPerSM[index].SM != -1) {
- if (nGpuArchCoresPerSM[index].SM == ((major << 4) + minor)) {
- return nGpuArchCoresPerSM[index].Cores;
- }
- index++;
- }
- printf("MapSMtoCores undefined SMversion %d.%d!\n", major, minor);
- return -1;
-}
-
-// This function returns the best GPU (with maximum GFLOPS).
-int cutGetMaxGflopsDeviceId()
-{
- int current_device = 0, sm_per_multiproc = 0;
- int max_compute_perf = 0, max_perf_device = -1;
- int device_count = 0, best_SM_arch = 0;
- int compat_major, compat_minor;
- cuDeviceGetCount(&device_count);
- // Find the best major SM Architecture GPU device.
- while (current_device < device_count) {
- cuDeviceComputeCapability(&compat_major, &compat_minor, current_device);
- if (compat_major > 0 && compat_major < 9999) {
- best_SM_arch = max(best_SM_arch, compat_major);
- }
- current_device++;
- }
- // Find the best CUDA capable GPU device.
- current_device = 0;
- while (current_device < device_count) {
- cuDeviceComputeCapability(&compat_major, &compat_minor, current_device);
- if (compat_major == 9999 && compat_minor == 9999) {
- sm_per_multiproc = 1;
- }
- else {
- sm_per_multiproc = convertSMVer2Cores_local(compat_major, compat_minor);
- }
- int multi_processor_count;
- cuDeviceGetAttribute(
- &multi_processor_count, CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT, current_device);
- int clock_rate;
- cuDeviceGetAttribute(&clock_rate, CU_DEVICE_ATTRIBUTE_CLOCK_RATE, current_device);
- int compute_perf = multi_processor_count * sm_per_multiproc * clock_rate;
- if (compute_perf > max_compute_perf) {
- /* If we find GPU with SM major > 2, search only these */
- if (best_SM_arch > 2) {
- /* If our device==dest_SM_arch, choose this, or else pass. */
- if (compat_major == best_SM_arch) {
- max_compute_perf = compute_perf;
- max_perf_device = current_device;
- }
- }
- else {
- max_compute_perf = compute_perf;
- max_perf_device = current_device;
- }
- }
- ++current_device;
- }
- return max_perf_device;
-}
-
-} // namespace
-
-bool CudaDeviceContext::HAS_CUDA_VERSION_4_0()
-{
-# ifdef OPENSUBDIV_HAS_CUDA
- static bool cuda_initialized = false;
- static bool cuda_load_success = true;
- if (!cuda_initialized) {
- cuda_initialized = true;
-
-# ifdef OPENSUBDIV_HAS_CUEW
- cuda_load_success = cuewInit(CUEW_INIT_CUDA) == CUEW_SUCCESS;
- if (!cuda_load_success) {
- fprintf(stderr, "Loading CUDA failed.\n");
- }
-# endif
- // Need to initialize CUDA here so getting device
- // with the maximum FPLOS works fine.
- if (cuInit(0) == CUDA_SUCCESS) {
- // This is to deal with cases like NVidia Optimus,
- // when there might be CUDA library installed but
- // NVidia card is not being active.
- if (cutGetMaxGflopsDeviceId() < 0) {
- cuda_load_success = false;
- }
- }
- else {
- cuda_load_success = false;
- }
- }
- return cuda_load_success;
-# else
- return false;
-# endif
-}
-
-CudaDeviceContext::CudaDeviceContext() : initialized_(false)
-{
-}
-
-CudaDeviceContext::~CudaDeviceContext()
-{
- cudaDeviceReset();
-}
-
-bool CudaDeviceContext::Initialize()
-{
- // See if any cuda device is available.
- int device_count = 0;
- cudaGetDeviceCount(&device_count);
- message("CUDA device count: %d\n", device_count);
- if (device_count <= 0) {
- return false;
- }
- cudaGLSetGLDevice(getCudaDeviceForCurrentGLContext());
- initialized_ = true;
- return true;
-}
-
-bool CudaDeviceContext::IsInitialized() const
-{
- return initialized_;
-}
-
-#endif // OPENSUBDIV_HAS_CUDA
diff --git a/intern/opensubdiv/internal/opensubdiv_device_context_cuda.h b/intern/opensubdiv/internal/opensubdiv_device_context_cuda.h
deleted file mode 100644
index 10164e0cfc5..00000000000
--- a/intern/opensubdiv/internal/opensubdiv_device_context_cuda.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Adopted from OpenSubdiv with the following license:
-//
-// Copyright 2013 Pixar
-//
-// Licensed under the Apache License, Version 2.0 (the "Apache License")
-// with the following modification; you may not use this file except in
-// compliance with the Apache License and the following modification to it:
-// Section 6. Trademarks. is deleted and replaced with:
-//
-// 6. Trademarks. This License does not grant permission to use the trade
-// names, trademarks, service marks, or product names of the Licensor
-// and its affiliates, except as required to comply with Section 4(c) of
-// the License and to reproduce the content of the NOTICE file.
-//
-// You may obtain a copy of the Apache License at
-//
-// http: //www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the Apache License with the above modification is
-// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the Apache License for the specific
-// language governing permissions and limitations under the Apache License.
-
-#ifndef OPENSUBDIV_DEVICE_CONTEXT_CUDA_H_
-#define OPENSUBDIV_DEVICE_CONTEXT_CUDA_H_
-
-#ifdef OPENSUBDIV_HAS_CUDA
-
-struct ID3D11Device;
-
-class CudaDeviceContext {
- public:
- CudaDeviceContext();
- ~CudaDeviceContext();
-
- static bool HAS_CUDA_VERSION_4_0();
-
- // Initialze cuda device from the current GL context.
- bool Initialize();
-
- // Initialze cuda device from the ID3D11Device.
- bool Initialize(ID3D11Device *device);
-
- // Returns true if the cuda device has already been initialized.
- bool IsInitialized() const;
-
- private:
- bool initialized_;
-};
-
-#endif // OPENSUBDIV_HAS_CUDA
-
-#endif // _OPENSUBDIV_DEVICE_CONTEXT_CUDA_H_
diff --git a/intern/opensubdiv/internal/opensubdiv_device_context_opencl.cc b/intern/opensubdiv/internal/opensubdiv_device_context_opencl.cc
deleted file mode 100644
index 72285930889..00000000000
--- a/intern/opensubdiv/internal/opensubdiv_device_context_opencl.cc
+++ /dev/null
@@ -1,258 +0,0 @@
-// Adopted from OpenSubdiv with the following license:
-//
-// Copyright 2015 Pixar
-//
-// Licensed under the Apache License, Version 2.0 (the "Apache License")
-// with the following modification; you may not use this file except in
-// compliance with the Apache License and the following modification to it:
-// Section 6. Trademarks. is deleted and replaced with:
-//
-// 6. Trademarks. This License does not grant permission to use the trade
-// names, trademarks, service marks, or product names of the Licensor
-// and its affiliates, except as required to comply with Section 4(c) of
-// the License and to reproduce the content of the NOTICE file.
-//
-// You may obtain a copy of the Apache License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the Apache License with the above modification is
-// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the Apache License for the specific
-// language governing permissions and limitations under the Apache License.
-
-#include "opensubdiv_device_context_opencl.h"
-
-#ifdef OPENSUBDIV_HAS_OPENCL
-
-# if defined(_WIN32)
-# include <windows.h>
-# elif defined(__APPLE__)
-# include <OpenGL/OpenGL.h>
-# else
-# include <GL/glx.h>
-# endif
-
-# include <cstdio>
-# include <cstring>
-
-# include "internal/opensubdiv_util.h"
-
-# define message(...) // fprintf(stderr, __VA_ARGS__)
-# define error(...) fprintf(stderr, __VA_ARGS__)
-
-namespace {
-
-// Returns the first found platform.
-cl_platform_id findPlatform()
-{
- cl_uint num_platforms;
- cl_int ci_error_number = clGetPlatformIDs(0, NULL, &num_platforms);
- if (ci_error_number != CL_SUCCESS) {
- error("Error %d in clGetPlatformIDs call.\n", ci_error_number);
- return NULL;
- }
- if (num_platforms == 0) {
- error("No OpenCL platform found.\n");
- return NULL;
- }
- vector<cl_platform_id> cl_platform_ids(num_platforms);
- ci_error_number = clGetPlatformIDs(num_platforms, &cl_platform_ids[0], NULL);
- char ch_buffer[1024];
- for (cl_uint i = 0; i < num_platforms; ++i) {
- ci_error_number = clGetPlatformInfo(
- cl_platform_ids[i], CL_PLATFORM_NAME, sizeof(ch_buffer), ch_buffer, NULL);
- if (ci_error_number == CL_SUCCESS) {
- cl_platform_id platform_id = cl_platform_ids[i];
- return platform_id;
- }
- }
- return NULL;
-}
-
-// Return the device in cl_devices which supports the extension.
-int findExtensionSupportedDevice(cl_device_id *cl_devices,
- int num_devices,
- const char *extension_name)
-{
- // Find a device that supports sharing with GL/D3D11
- // (SLI / X-fire configurations)
- cl_int cl_error_number;
- for (int i = 0; i < num_devices; ++i) {
- // Get extensions string size.
- size_t extensions_size;
- cl_error_number = clGetDeviceInfo(
- cl_devices[i], CL_DEVICE_EXTENSIONS, 0, NULL, &extensions_size);
- if (cl_error_number != CL_SUCCESS) {
- error("Error %d in clGetDeviceInfo\n", cl_error_number);
- return -1;
- }
- if (extensions_size > 0) {
- // Get extensions string.
- string extensions('\0', extensions_size);
- cl_error_number = clGetDeviceInfo(
- cl_devices[i], CL_DEVICE_EXTENSIONS, extensions_size, &extensions[0], &extensions_size);
- if (cl_error_number != CL_SUCCESS) {
- error("Error %d in clGetDeviceInfo\n", cl_error_number);
- continue;
- }
- // Parse string. This is bit deficient since the extentions
- // is space separated.
- //
- // The actual string would be "cl_khr_d3d11_sharing"
- // or "cl_nv_d3d11_sharing"
- if (extensions.find(extension_name) != string::npos) {
- return i;
- }
- }
- }
- return -1;
-}
-
-} // namespace
-
-CLDeviceContext::CLDeviceContext() : cl_context_(NULL), cl_command_queue_(NULL)
-{
-}
-
-CLDeviceContext::~CLDeviceContext()
-{
- if (cl_command_queue_) {
- clReleaseCommandQueue(cl_command_queue_);
- }
- if (cl_context_) {
- clReleaseContext(cl_context_);
- }
-}
-
-bool CLDeviceContext::HAS_CL_VERSION_1_1()
-{
-# ifdef OPENSUBDIV_HAS_CLEW
- static bool clew_initialized = false;
- static bool clew_load_success;
- if (!clew_initialized) {
- clew_initialized = true;
- clew_load_success = clewInit() == CLEW_SUCCESS;
- if (!clew_load_success) {
- error("Loading OpenCL failed.\n");
- }
- }
- return clew_load_success;
-# endif
- return true;
-}
-
-bool CLDeviceContext::Initialize()
-{
-# ifdef OPENSUBDIV_HAS_CLEW
- if (!clGetPlatformIDs) {
- error("Error clGetPlatformIDs function not bound.\n");
- return false;
- }
-# endif
- cl_int cl_error_number;
- cl_platform_id cp_platform = findPlatform();
-
-# if defined(_WIN32)
- cl_context_properties props[] = {
- CL_GL_CONTEXT_KHR,
- (cl_context_properties)wglGetCurrentContext(),
- CL_WGL_HDC_KHR,
- (cl_context_properties)wglGetCurrentDC(),
- CL_CONTEXT_PLATFORM,
- (cl_context_properties)cp_platform,
- 0,
- };
-# elif defined(__APPLE__)
- CGLContextObj kCGLContext = CGLGetCurrentContext();
- CGLShareGroupObj kCGLShareGroup = CGLGetShareGroup(kCGLContext);
- cl_context_properties props[] = {
- CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE, (cl_context_properties)kCGLShareGroup, 0};
-# else
- cl_context_properties props[] = {
- CL_GL_CONTEXT_KHR,
- (cl_context_properties)glXGetCurrentContext(),
- CL_GLX_DISPLAY_KHR,
- (cl_context_properties)glXGetCurrentDisplay(),
- CL_CONTEXT_PLATFORM,
- (cl_context_properties)cp_platform,
- 0,
- };
-# endif
-
-# if defined(__APPLE__)
- _clContext = clCreateContext(props, 0, NULL, clLogMessagesToStdoutAPPLE, NULL, &cl_error_number);
- if (cl_error_number != CL_SUCCESS) {
- error("Error %d in clCreateContext\n", cl_error_number);
- return false;
- }
- size_t devices_size = 0;
- clGetGLContextInfoAPPLE(_clContext,
- kCGLContext,
- CL_CGL_DEVICES_FOR_SUPPORTED_VIRTUAL_SCREENS_APPLE,
- 0,
- NULL,
- &devices_size);
- const int num_devices = devices_size / sizeof(cl_device_id);
- if (num_devices == 0) {
- error("No sharable devices.\n");
- return false;
- }
- vector<cl_device_id> cl_devices(num_devices);
- clGetGLContextInfoAPPLE(_clContext,
- kCGLContext,
- CL_CGL_DEVICES_FOR_SUPPORTED_VIRTUAL_SCREENS_APPLE,
- num_devices * sizeof(cl_device_id),
- &cl_devices[0],
- NULL);
- int cl_device_used = 0;
-# else // not __APPLE__
- // Get the number of GPU devices available to the platform.
- cl_uint num_devices = 0;
- clGetDeviceIDs(cp_platform, CL_DEVICE_TYPE_GPU, 0, NULL, &num_devices);
- if (num_devices == 0) {
- error("No CL GPU device found.\n");
- return false;
- }
- // Create the device list.
- vector<cl_device_id> cl_devices(num_devices);
- clGetDeviceIDs(cp_platform, CL_DEVICE_TYPE_GPU, num_devices, &cl_devices[0], NULL);
- const char *extension = "cl_khr_gl_sharing";
- int cl_device_used = findExtensionSupportedDevice(&cl_devices[0], num_devices, extension);
- if (cl_device_used < 0) {
- error("No device found that supports CL/GL context sharing\n");
- return false;
- }
- cl_context_ = clCreateContext(
- props, 1, &cl_devices[cl_device_used], NULL, NULL, &cl_error_number);
-# endif // not __APPLE__
- if (cl_error_number != CL_SUCCESS) {
- error("Error %d in clCreateContext\n", cl_error_number);
- return false;
- }
- cl_command_queue_ = clCreateCommandQueue(
- cl_context_, cl_devices[cl_device_used], 0, &cl_error_number);
- if (cl_error_number != CL_SUCCESS) {
- error("Error %d in clCreateCommandQueue\n", cl_error_number);
- return false;
- }
- return true;
-}
-
-bool CLDeviceContext::IsInitialized() const
-{
- return (cl_context_ != NULL);
-}
-
-cl_context CLDeviceContext::GetContext() const
-{
- return cl_context_;
-}
-
-cl_command_queue CLDeviceContext::GetCommandQueue() const
-{
- return cl_command_queue_;
-}
-
-#endif // OPENSUBDIV_HAS_OPENCL
diff --git a/intern/opensubdiv/internal/opensubdiv_device_context_opencl.h b/intern/opensubdiv/internal/opensubdiv_device_context_opencl.h
deleted file mode 100644
index 6baf0774319..00000000000
--- a/intern/opensubdiv/internal/opensubdiv_device_context_opencl.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Adopted from OpenSubdiv with the following license:
-//
-// Copyright 2015 Pixar
-//
-// Licensed under the Apache License, Version 2.0 (the "Apache License")
-// with the following modification; you may not use this file except in
-// compliance with the Apache License and the following modification to it:
-// Section 6. Trademarks. is deleted and replaced with:
-//
-// 6. Trademarks. This License does not grant permission to use the trade
-// names, trademarks, service marks, or product names of the Licensor
-// and its affiliates, except as required to comply with Section 4(c) of
-// the License and to reproduce the content of the NOTICE file.
-//
-// You may obtain a copy of the Apache License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the Apache License with the above modification is
-// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the Apache License for the specific
-// language governing permissions and limitations under the Apache License.
-
-#ifndef OPENSUBDIV_DEVICE_CONTEXT_OPENCL_H_
-#define OPENSUBDIV_DEVICE_CONTEXT_OPENCL_H_
-
-#ifdef OPENSUBDIV_HAS_OPENCL
-# include <opensubdiv/osd/opencl.h>
-
-class CLDeviceContext {
- public:
- static bool HAS_CL_VERSION_1_1();
-
- CLDeviceContext();
- ~CLDeviceContext();
-
- bool Initialize();
-
- bool IsInitialized() const;
-
- cl_context GetContext() const;
- cl_command_queue GetCommandQueue() const;
-
- protected:
- cl_context cl_context_;
- cl_command_queue cl_command_queue_;
-};
-
-#endif // OPENSUBDIV_HAS_OPENCL
-
-#endif // _OPENSUBDIV_DEVICE_CONTEXT_OPENCL_H_