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:
Diffstat (limited to 'intern/cycles/hydra')
-rw-r--r--intern/cycles/hydra/display_driver.cpp74
-rw-r--r--intern/cycles/hydra/display_driver.h3
-rw-r--r--intern/cycles/hydra/file_reader.cpp6
-rw-r--r--intern/cycles/hydra/render_delegate.cpp30
-rw-r--r--intern/cycles/hydra/render_delegate.h12
5 files changed, 79 insertions, 46 deletions
diff --git a/intern/cycles/hydra/display_driver.cpp b/intern/cycles/hydra/display_driver.cpp
index 6f6ca35cd31..a809ace63e2 100644
--- a/intern/cycles/hydra/display_driver.cpp
+++ b/intern/cycles/hydra/display_driver.cpp
@@ -19,44 +19,66 @@ HDCYCLES_NAMESPACE_OPEN_SCOPE
HdCyclesDisplayDriver::HdCyclesDisplayDriver(HdCyclesSession *renderParam, Hgi *hgi)
: _renderParam(renderParam), _hgi(hgi)
{
+}
+
+HdCyclesDisplayDriver::~HdCyclesDisplayDriver()
+{
+ deinit();
+}
+
+void HdCyclesDisplayDriver::init()
+{
#ifdef _WIN32
- hdc_ = GetDC(CreateWindowA("STATIC",
- "HdCycles",
- WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
- 0,
- 0,
- 64,
- 64,
- NULL,
- NULL,
- GetModuleHandle(NULL),
- NULL));
-
- int pixelFormat = GetPixelFormat(wglGetCurrentDC());
- PIXELFORMATDESCRIPTOR pfd = {sizeof(pfd)};
- DescribePixelFormat((HDC)hdc_, pixelFormat, sizeof(pfd), &pfd);
- SetPixelFormat((HDC)hdc_, pixelFormat, &pfd);
-
- TF_VERIFY(gl_context_ = wglCreateContext((HDC)hdc_));
- TF_VERIFY(wglShareLists(wglGetCurrentContext(), (HGLRC)gl_context_));
+ if (!gl_context_) {
+ hdc_ = GetDC(CreateWindowA("STATIC",
+ "HdCycles",
+ WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
+ 0,
+ 0,
+ 64,
+ 64,
+ NULL,
+ NULL,
+ GetModuleHandle(NULL),
+ NULL));
+
+ int pixelFormat = GetPixelFormat(wglGetCurrentDC());
+ PIXELFORMATDESCRIPTOR pfd = {sizeof(pfd)};
+ DescribePixelFormat((HDC)hdc_, pixelFormat, sizeof(pfd), &pfd);
+ SetPixelFormat((HDC)hdc_, pixelFormat, &pfd);
+
+ TF_VERIFY(gl_context_ = wglCreateContext((HDC)hdc_));
+ TF_VERIFY(wglShareLists(wglGetCurrentContext(), (HGLRC)gl_context_));
+ }
+ if (!gl_context_) {
+ return;
+ }
#endif
- glewInit();
+ if (!gl_pbo_id_) {
+ if (glewInit() != GLEW_OK) {
+ return;
+ }
- glGenBuffers(1, &gl_pbo_id_);
+ glGenBuffers(1, &gl_pbo_id_);
+ }
}
-HdCyclesDisplayDriver::~HdCyclesDisplayDriver()
+void HdCyclesDisplayDriver::deinit()
{
if (texture_) {
_hgi->DestroyTexture(&texture_);
}
- glDeleteBuffers(1, &gl_pbo_id_);
+ if (gl_pbo_id_) {
+ glDeleteBuffers(1, &gl_pbo_id_);
+ }
#ifdef _WIN32
- TF_VERIFY(wglDeleteContext((HGLRC)gl_context_));
- DestroyWindow(WindowFromDC((HDC)hdc_));
+ if (gl_context_) {
+ TF_VERIFY(wglDeleteContext((HGLRC)gl_context_));
+ DestroyWindow(WindowFromDC((HDC)hdc_));
+ }
#endif
}
@@ -192,6 +214,8 @@ void HdCyclesDisplayDriver::draw(const Params &params)
return;
}
+ init();
+
// Cycles 'DisplayDriver' only supports 'half4' format
TF_VERIFY(renderBuffer->GetFormat() == HdFormatFloat16Vec4);
diff --git a/intern/cycles/hydra/display_driver.h b/intern/cycles/hydra/display_driver.h
index 668f7d76eed..20086830e6a 100644
--- a/intern/cycles/hydra/display_driver.h
+++ b/intern/cycles/hydra/display_driver.h
@@ -19,6 +19,9 @@ class HdCyclesDisplayDriver final : public CCL_NS::DisplayDriver {
~HdCyclesDisplayDriver();
private:
+ void init();
+ void deinit();
+
void next_tile_begin() override;
bool update_begin(const Params &params, int texture_width, int texture_height) override;
diff --git a/intern/cycles/hydra/file_reader.cpp b/intern/cycles/hydra/file_reader.cpp
index 329cc959ac3..8925626d8c3 100644
--- a/intern/cycles/hydra/file_reader.cpp
+++ b/intern/cycles/hydra/file_reader.cpp
@@ -18,6 +18,7 @@
#include <pxr/imaging/hd/task.h>
#include <pxr/usd/usd/stage.h>
#include <pxr/usd/usdGeom/camera.h>
+#include <pxr/usd/usdGeom/metrics.h>
#include <pxr/usdImaging/usdImaging/delegate.h>
HDCYCLES_NAMESPACE_OPEN_SCOPE
@@ -69,6 +70,9 @@ void HdCyclesFileReader::read(Session *session, const char *filepath, const bool
/* Create render delegate. */
HdRenderSettingsMap settings_map;
+ settings_map.insert(std::make_pair(HdCyclesRenderSettingsTokens->stageMetersPerUnit,
+ VtValue(UsdGeomGetStageMetersPerUnit(stage))));
+
HdCyclesDelegate render_delegate(settings_map, session, true);
/* Create render index and scene delegate. */
@@ -110,7 +114,7 @@ void HdCyclesFileReader::read(Session *session, const char *filepath, const bool
HdSprim *sprim = render_index->GetSprim(HdPrimTypeTokens->camera, prim.GetPath());
if (sprim) {
HdCyclesCamera *camera = dynamic_cast<HdCyclesCamera *>(sprim);
- camera->ApplyCameraSettings(session->scene->camera);
+ camera->ApplyCameraSettings(render_delegate.GetRenderParam(), session->scene->camera);
break;
}
}
diff --git a/intern/cycles/hydra/render_delegate.cpp b/intern/cycles/hydra/render_delegate.cpp
index 8671ac742be..208deaae92d 100644
--- a/intern/cycles/hydra/render_delegate.cpp
+++ b/intern/cycles/hydra/render_delegate.cpp
@@ -26,20 +26,13 @@
HDCYCLES_NAMESPACE_OPEN_SCOPE
+TF_DEFINE_PUBLIC_TOKENS(HdCyclesRenderSettingsTokens, HD_CYCLES_RENDER_SETTINGS_TOKENS);
+
// clang-format off
TF_DEFINE_PRIVATE_TOKENS(_tokens,
(cycles)
(openvdbAsset)
);
-
-TF_DEFINE_PRIVATE_TOKENS(HdCyclesRenderSettingsTokens,
- (stageMetersPerUnit)
- ((device, "cycles:device"))
- ((threads, "cycles:threads"))
- ((timeLimit, "cycles:time_limit"))
- ((samples, "cycles:samples"))
- ((sampleOffset, "cycles:sample_offset"))
-);
// clang-format on
namespace {
@@ -127,17 +120,14 @@ HdCyclesDelegate::HdCyclesDelegate(const HdRenderSettingsMap &settingsMap,
_renderParam = session_ ? std::make_unique<HdCyclesSession>(session_, keep_nodes) :
std::make_unique<HdCyclesSession>(GetSessionParams(settingsMap));
- // If the delegate owns the session, pull any remaining settings
- if (!session_) {
- for (const auto &setting : settingsMap) {
- // Skip over the settings known to be used for initialization only
- if (setting.first == HdCyclesRenderSettingsTokens->device ||
- setting.first == HdCyclesRenderSettingsTokens->threads) {
- continue;
- }
-
- SetRenderSetting(setting.first, setting.second);
+ for (const auto &setting : settingsMap) {
+ // Skip over the settings known to be used for initialization only
+ if (setting.first == HdCyclesRenderSettingsTokens->device ||
+ setting.first == HdCyclesRenderSettingsTokens->threads) {
+ continue;
}
+
+ SetRenderSetting(setting.first, setting.second);
}
}
@@ -328,7 +318,7 @@ HdBprim *HdCyclesDelegate::CreateBprim(const TfToken &typeId, const SdfPath &bpr
}
#endif
- TF_RUNTIME_ERROR("Unknown Bprim type %s", typeId.GetText());
+ TF_CODING_ERROR("Unknown Bprim type %s", typeId.GetText());
return nullptr;
}
diff --git a/intern/cycles/hydra/render_delegate.h b/intern/cycles/hydra/render_delegate.h
index 7c5ee22e9d6..dc7f21a6481 100644
--- a/intern/cycles/hydra/render_delegate.h
+++ b/intern/cycles/hydra/render_delegate.h
@@ -11,6 +11,18 @@
HDCYCLES_NAMESPACE_OPEN_SCOPE
+// clang-format off
+#define HD_CYCLES_RENDER_SETTINGS_TOKENS \
+ (stageMetersPerUnit) \
+ ((device, "cycles:device")) \
+ ((threads, "cycles:threads")) \
+ ((timeLimit, "cycles:time_limit")) \
+ ((samples, "cycles:samples")) \
+ ((sampleOffset, "cycles:sample_offset"))
+// clang-format on
+
+TF_DECLARE_PUBLIC_TOKENS(HdCyclesRenderSettingsTokens, HD_CYCLES_RENDER_SETTINGS_TOKENS);
+
class HdCyclesDelegate final : public PXR_NS::HdRenderDelegate {
public:
HdCyclesDelegate(const PXR_NS::HdRenderSettingsMap &settingsMap,