11# ifndef WIN32_LEAN_AND_MEAN
12# define WIN32_LEAN_AND_MEAN
22#include <pxr/imaging/hgiGL/texture.h>
27 : _renderParam(renderParam), _hgi(hgi)
34 _hgi->DestroyTexture(&texture_);
38 glDeleteBuffers(1, &gl_pbo_id_);
44void HdCyclesDisplayDriver::gl_context_create()
48 hdc_ = GetDC(CreateWindowA(
"STATIC",
50 WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
57 GetModuleHandle(
nullptr),
60 int pixelFormat = GetPixelFormat(wglGetCurrentDC());
61 PIXELFORMATDESCRIPTOR pfd = {
sizeof(pfd)};
62 DescribePixelFormat((HDC)hdc_, pixelFormat,
sizeof(pfd), &pfd);
63 SetPixelFormat((HDC)hdc_, pixelFormat, &pfd);
65 TF_VERIFY(gl_context_ = wglCreateContext((HDC)hdc_));
66 TF_VERIFY(wglShareLists(wglGetCurrentContext(), (HGLRC)gl_context_));
74 glGenBuffers(1, &gl_pbo_id_);
75 graphics_interop_buffer_.clear();
79bool HdCyclesDisplayDriver::gl_context_enable()
82 if (!hdc_ || !gl_context_) {
89 if (wglGetCurrentContext() ==
nullptr) {
90 if (!TF_VERIFY(wglMakeCurrent((HDC)hdc_, (HGLRC)gl_context_))) {
102void HdCyclesDisplayDriver::gl_context_disable()
105 if (wglGetCurrentContext() == gl_context_) {
106 TF_VERIFY(wglMakeCurrent(
nullptr,
nullptr));
113void HdCyclesDisplayDriver::gl_context_dispose()
117 TF_VERIFY(wglDeleteContext((HGLRC)gl_context_));
118 DestroyWindow(WindowFromDC((HDC)hdc_));
123void HdCyclesDisplayDriver::next_tile_begin() {}
125bool HdCyclesDisplayDriver::update_begin(
const Params &
params,
129 if (!gl_context_enable()) {
133 if (gl_render_sync_) {
134 glWaitSync((GLsync)gl_render_sync_, 0, GL_TIMEOUT_IGNORED);
137 if (pbo_size_.x !=
params.full_size.x || pbo_size_.y !=
params.full_size.y) {
138 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_pbo_id_);
139 glBufferData(GL_PIXEL_UNPACK_BUFFER,
143 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
145 pbo_size_ =
params.full_size;
146 graphics_interop_buffer_.clear();
154void HdCyclesDisplayDriver::update_end()
156 gl_upload_sync_ = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
159 gl_context_disable();
162void HdCyclesDisplayDriver::flush()
166 if (gl_upload_sync_) {
167 glWaitSync((GLsync)gl_upload_sync_, 0, GL_TIMEOUT_IGNORED);
170 if (gl_render_sync_) {
171 glWaitSync((GLsync)gl_render_sync_, 0, GL_TIMEOUT_IGNORED);
174 gl_context_disable();
177half4 *HdCyclesDisplayDriver::map_texture_buffer()
179 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_pbo_id_);
181 auto *
const mapped_rgba_pixels =
static_cast<half4 *
>(
182 glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY));
184 if (need_zero_ && mapped_rgba_pixels) {
185 memset(mapped_rgba_pixels, 0,
sizeof(
half4) * pbo_size_.x * pbo_size_.y);
189 return mapped_rgba_pixels;
192void HdCyclesDisplayDriver::unmap_texture_buffer()
194 glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
196 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
201 GraphicsInteropDevice interop_device;
203 return interop_device;
206void HdCyclesDisplayDriver::graphics_interop_update_buffer()
208 if (graphics_interop_buffer_.is_empty()) {
209 graphics_interop_buffer_.assign(
214 graphics_interop_buffer_.zero();
219void HdCyclesDisplayDriver::graphics_interop_activate()
224void HdCyclesDisplayDriver::graphics_interop_deactivate()
226 gl_context_disable();
229void HdCyclesDisplayDriver::zero()
234void HdCyclesDisplayDriver::draw(
const Params &
params)
236 auto *
const renderBuffer =
static_cast<HdCyclesRenderBuffer *
>(
237 _renderParam->GetDisplayAovBinding().renderBuffer);
239 (renderBuffer->GetWidth() !=
params.size.x || renderBuffer->GetHeight() !=
params.size.y))
244 if (!renderBuffer->IsResourceUsed()) {
251 TF_VERIFY(renderBuffer->GetFormat() == HdFormatFloat16Vec4);
255 const GfVec3i dimensions(
params.size.x,
params.size.y, 1);
256 if (!texture_ || texture_->GetDescriptor().dimensions != dimensions) {
258 _hgi->DestroyTexture(&texture_);
261 HgiTextureDesc texDesc;
263 texDesc.format = HgiFormatFloat16Vec4;
264 texDesc.type = HgiTextureType2D;
265 texDesc.dimensions = dimensions;
266 texDesc.sampleCount = HgiSampleCount1;
268 texture_ = _hgi->CreateTexture(texDesc);
270 renderBuffer->SetResource(VtValue(texture_));
273 HgiGLTexture *
const texture =
dynamic_cast<HgiGLTexture *
>(texture_.Get());
274 if (!
texture || !need_update_ || pbo_size_.x !=
params.size.x || pbo_size_.y !=
params.size.y) {
278 if (gl_upload_sync_) {
279 glWaitSync((GLsync)gl_upload_sync_, 0, GL_TIMEOUT_IGNORED);
282 glBindTexture(GL_TEXTURE_2D,
texture->GetTextureId());
283 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_pbo_id_);
285 GL_TEXTURE_2D, 0, 0, 0, pbo_size_.x, pbo_size_.y, GL_RGBA, GL_HALF_FLOAT,
nullptr);
286 glBindTexture(GL_TEXTURE_2D, 0);
287 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
289 gl_render_sync_ = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
292 need_update_ =
false;
HdCyclesDisplayDriver(HdCyclesSession *renderParam, Hgi *hgi)
~HdCyclesDisplayDriver() override
TEX_TEMPLATE DataVec texture(T, FltCoord, float=0.0f) RET
#define HDCYCLES_NAMESPACE_CLOSE_SCOPE
std::unique_lock< std::mutex > thread_scoped_lock