diff options
Diffstat (limited to 'examples/quick/scenegraph/rendernode/metalrenderer.mm')
-rw-r--r-- | examples/quick/scenegraph/rendernode/metalrenderer.mm | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/examples/quick/scenegraph/rendernode/metalrenderer.mm b/examples/quick/scenegraph/rendernode/metalrenderer.mm index 4cb973abee..b83dc62c48 100644 --- a/examples/quick/scenegraph/rendernode/metalrenderer.mm +++ b/examples/quick/scenegraph/rendernode/metalrenderer.mm @@ -131,7 +131,7 @@ void MetalRenderNodeResourceBuilder::build() g.fs = compileShaderFromSource(g.fsSource, QByteArrayLiteral("main0")); } - const int framesInFlight = m_window->graphicsStateInfo()->framesInFlight; + const int framesInFlight = m_window->graphicsStateInfo().framesInFlight; // For simplicity's sake we use shared mode (something like host visible + // host coherent) for everything. @@ -214,8 +214,7 @@ void MetalRenderNodeResourceBuilder::build() } } -MetalRenderNode::MetalRenderNode(QQuickItem *item) - : m_item(item) +MetalRenderNode::MetalRenderNode() { g.vs.first = g.fs.first = nil; g.vs.second = g.fs.second = nil; @@ -258,14 +257,14 @@ void MetalRenderNode::releaseResources() void MetalRenderNode::render(const RenderState *state) { - QQuickWindow *window = m_item->window(); - const QQuickWindow::GraphicsStateInfo *stateInfo = window->graphicsStateInfo(); - id<MTLBuffer> vbuf = g.vbuf[stateInfo->currentFrameSlot]; - id<MTLBuffer> ubuf = g.ubuf[stateInfo->currentFrameSlot]; + Q_ASSERT(m_window); + const QQuickWindow::GraphicsStateInfo &stateInfo(m_window->graphicsStateInfo()); + id<MTLBuffer> vbuf = g.vbuf[stateInfo.currentFrameSlot]; + id<MTLBuffer> ubuf = g.ubuf[stateInfo.currentFrameSlot]; - QPointF p0(m_item->width() - 1, m_item->height() - 1); + QPointF p0(m_width - 1, m_height - 1); QPointF p1(0, 0); - QPointF p2(0, m_item->height() - 1); + QPointF p2(0, m_height - 1); float vertices[6] = { float(p0.x()), float(p0.y()), float(p1.x()), float(p1.y()), @@ -280,9 +279,9 @@ void MetalRenderNode::render(const RenderState *state) memcpy(p, mvp.constData(), 64); memcpy(p + 64, &opacity, 4); - QSGRendererInterface *rif = window->rendererInterface(); + QSGRendererInterface *rif = m_window->rendererInterface(); id<MTLRenderCommandEncoder> encoder = (id<MTLRenderCommandEncoder>) rif->getResource( - window, QSGRendererInterface::CommandEncoderResource); + m_window, QSGRendererInterface::CommandEncoderResource); Q_ASSERT(encoder); [encoder setVertexBuffer: vbuf offset: 0 atIndex: 1]; @@ -296,7 +295,7 @@ void MetalRenderNode::render(const RenderState *state) const QRect r = state->scissorRect(); // bottom-up MTLScissorRect s; s.x = r.x(); - s.y = (window->height() * window->effectiveDevicePixelRatio()) - (r.y() + r.height()); + s.y = m_outputHeight - (r.y() + r.height()); s.width = r.width(); s.height = r.height(); [encoder setScissorRect: s]; @@ -322,5 +321,13 @@ QSGRenderNode::RenderingFlags MetalRenderNode::flags() const QRectF MetalRenderNode::rect() const { - return QRect(0, 0, m_item->width(), m_item->height()); + return QRect(0, 0, m_width, m_height); +} + +void MetalRenderNode::sync(QQuickItem *item) +{ + m_window = item->window(); + m_width = item->width(); + m_height = item->height(); + m_outputHeight = m_window->height() * m_window->effectiveDevicePixelRatio(); } |