summaryrefslogtreecommitdiffstats
path: root/tests/manual/rhi/tex1d/tex1d.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/manual/rhi/tex1d/tex1d.cpp')
-rw-r--r--tests/manual/rhi/tex1d/tex1d.cpp625
1 files changed, 625 insertions, 0 deletions
diff --git a/tests/manual/rhi/tex1d/tex1d.cpp b/tests/manual/rhi/tex1d/tex1d.cpp
new file mode 100644
index 0000000000..7791c840ca
--- /dev/null
+++ b/tests/manual/rhi/tex1d/tex1d.cpp
@@ -0,0 +1,625 @@
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include "../shared/examplefw.h"
+#include <QImage>
+#include <QPainter>
+#include <functional>
+
+static float quadVertexData[] = { // Y up, CCW
+ -0.5f, 0.5f, 0.0f, 0.0f, -0.5f, -0.5f, 0.0f, 1.0f,
+ 0.5f, -0.5f, 1.0f, 1.0f, 0.5f, 0.5f, 1.0f, 0.0f
+};
+
+static quint16 quadIndexData[] = { 0, 1, 2, 0, 2, 3 };
+
+struct
+{
+ QList<QRhiResource *> releasePool;
+ QRhiResourceUpdateBatch *initialUpdates = nullptr;
+
+ QRhiBuffer *vertexBuffer = nullptr;
+ QRhiBuffer *indexBuffer = nullptr;
+ QRhiBuffer *uniformBuffer = nullptr;
+ QRhiGraphicsPipeline *ps = nullptr;
+ QRhiShaderResourceBindings *srb = nullptr;
+ int index = 0;
+} d;
+
+void readBackCompleted(QRhiReadbackResult *result, const QByteArray &expected)
+{
+ if (result->data != expected) {
+ qFatal("texture readback data did not match expected values");
+ }
+
+ delete result;
+}
+
+void Window::customInit()
+{
+ if (!m_r->isFeatureSupported(QRhi::Feature::OneDimensionalTextures))
+ qFatal("1D textures are not supported");
+
+ const bool mipmaps = m_r->isFeatureSupported(QRhi::Feature::OneDimensionalTextureMipmaps);
+
+ d.initialUpdates = m_r->nextResourceUpdateBatch();
+
+ QRhiTexture *texture = nullptr;
+ QRhiReadbackResult *readbackResult = nullptr;
+ QRhiReadbackDescription readbackDescription;
+ QByteArray data;
+
+ QList<QRhiShaderResourceBinding> shaderResouceBindings;
+
+ //
+ // Create vertex buffer
+ //
+ d.vertexBuffer =
+ m_r->newBuffer(QRhiBuffer::Immutable, QRhiBuffer::VertexBuffer, sizeof(quadVertexData));
+ d.vertexBuffer->create();
+ d.releasePool << d.vertexBuffer;
+
+ d.initialUpdates->uploadStaticBuffer(d.vertexBuffer, 0, sizeof(quadVertexData), quadVertexData);
+
+ //
+ // Create index buffer
+ //
+ d.indexBuffer =
+ m_r->newBuffer(QRhiBuffer::Immutable, QRhiBuffer::IndexBuffer, sizeof(quadIndexData));
+ d.indexBuffer->create();
+ d.releasePool << d.indexBuffer;
+
+ d.initialUpdates->uploadStaticBuffer(d.indexBuffer, quadIndexData);
+
+ //
+ // Create uniform buffer
+ //
+ d.uniformBuffer =
+ m_r->newBuffer(QRhiBuffer::Dynamic, QRhiBuffer::UniformBuffer, m_r->ubufAligned(4));
+ d.uniformBuffer->create();
+ d.releasePool << d.uniformBuffer;
+
+ shaderResouceBindings.append(QRhiShaderResourceBinding::uniformBuffer(
+ 0, QRhiShaderResourceBinding::StageFlag::FragmentStage, d.uniformBuffer, 0, 4));
+
+ //
+ // Create samplers
+ //
+ QRhiSampler *samplerNearest = m_r->newSampler(
+ QRhiSampler::Filter::Nearest, QRhiSampler::Filter::Nearest,
+ QRhiSampler::Filter::Nearest, QRhiSampler::AddressMode::ClampToEdge,
+ QRhiSampler::AddressMode::ClampToEdge, QRhiSampler::AddressMode::ClampToEdge);
+ d.releasePool << samplerNearest;
+ samplerNearest->create();
+
+ QRhiSampler *samplerNone = m_r->newSampler(
+ QRhiSampler::Filter::Nearest, QRhiSampler::Filter::Nearest, QRhiSampler::Filter::None,
+ QRhiSampler::AddressMode::ClampToEdge, QRhiSampler::AddressMode::ClampToEdge,
+ QRhiSampler::AddressMode::ClampToEdge);
+ d.releasePool << samplerNone;
+ samplerNone->create();
+
+ //
+ // 1D texture with generated mipmaps. Contains grey colormap
+ //
+ texture = m_r->newTexture(QRhiTexture::Format::RGBA8, 8, 0, 0, 1,
+ QRhiTexture::Flag::OneDimensional
+ | QRhiTexture::Flag::UsedAsTransferSource
+ | (mipmaps ? (QRhiTexture::Flag::MipMapped
+ | QRhiTexture::Flag::UsedWithGenerateMips)
+ : QRhiTexture::Flag(0)));
+ d.releasePool << texture;
+ texture->create();
+
+ shaderResouceBindings.append(QRhiShaderResourceBinding::sampledTexture(
+ 1, QRhiShaderResourceBinding::FragmentStage, texture,
+ texture->flags().testFlag(QRhiTexture::Flag::MipMapped) ? samplerNearest
+ : samplerNone));
+
+ for (int i = 0; i < 8; ++i) {
+ data.append(char(i) * 32);
+ data.append(char(i) * 32);
+ data.append(char(i) * 32);
+ data.append(char(255));
+ }
+ d.initialUpdates->uploadTexture(
+ texture, QRhiTextureUploadEntry(0, 0, QRhiTextureSubresourceUploadDescription(data)));
+ if (mipmaps)
+ d.initialUpdates->generateMips(texture);
+
+ readbackResult = new QRhiReadbackResult;
+ readbackResult->completed = std::bind(readBackCompleted, readbackResult, data);
+ readbackDescription.setTexture(texture);
+ readbackDescription.setLayer(0);
+ readbackDescription.setLevel(0);
+ d.initialUpdates->readBackTexture(readbackDescription, readbackResult);
+
+ //
+ // 1D texture array with generated mipmaps. layer 0 contains red colormap, layer 1 contains
+ // green colormap
+ //
+ texture =
+ m_r->newTextureArray(QRhiTexture::RGBA8, 2, QSize(8, 0), 1,
+ QRhiTexture::Flag::TextureArray | QRhiTexture::Flag::OneDimensional
+ | QRhiTexture::Flag::UsedAsTransferSource
+ | (mipmaps ? (QRhiTexture::Flag::MipMapped
+ | QRhiTexture::Flag::UsedWithGenerateMips)
+ : QRhiTexture::Flag(0)));
+ d.releasePool << texture;
+ texture->create();
+
+ shaderResouceBindings.append(QRhiShaderResourceBinding::sampledTexture(
+ 2, QRhiShaderResourceBinding::FragmentStage, texture,
+ texture->flags().testFlag(QRhiTexture::Flag::MipMapped) ? samplerNearest
+ : samplerNone));
+
+ data.clear();
+ for (int i = 0; i < 8; ++i) {
+ data.append(char(i * 32));
+ data.append(char(0));
+ data.append(char(0));
+ data.append(char(255));
+ }
+ d.initialUpdates->uploadTexture(
+ texture, QRhiTextureUploadEntry(0, 0, QRhiTextureSubresourceUploadDescription(data)));
+
+ readbackResult = new QRhiReadbackResult;
+ readbackResult->completed = std::bind(readBackCompleted, readbackResult, data);
+ readbackDescription.setTexture(texture);
+ readbackDescription.setLayer(0);
+ readbackDescription.setLevel(0);
+ d.initialUpdates->readBackTexture(readbackDescription, readbackResult);
+
+ data.clear();
+ for (int i = 0; i < 8; ++i) {
+ data.append(char(0));
+ data.append(char(i * 32));
+ data.append(char(0));
+ data.append(char(255));
+ }
+ d.initialUpdates->uploadTexture(
+ texture, QRhiTextureUploadEntry(1, 0, QRhiTextureSubresourceUploadDescription(data)));
+ if (mipmaps)
+ d.initialUpdates->generateMips(texture);
+
+ readbackResult = new QRhiReadbackResult;
+ readbackResult->completed = std::bind(readBackCompleted, readbackResult, data);
+ readbackDescription.setTexture(texture);
+ readbackDescription.setLayer(1);
+ readbackDescription.setLevel(0);
+ d.initialUpdates->readBackTexture(readbackDescription, readbackResult);
+
+ //
+ // 1D texture with uploaded mipmaps. Contains yellow colormap
+ //
+ texture = m_r->newTexture(
+ QRhiTexture::Format::RGBA8, 8, 0, 0, 1,
+ QRhiTexture::Flag::OneDimensional | QRhiTexture::Flag::UsedAsTransferSource
+ | (mipmaps ? QRhiTexture::Flag::MipMapped : QRhiTexture::Flag(0)));
+ d.releasePool << texture;
+ texture->create();
+
+ shaderResouceBindings.append(QRhiShaderResourceBinding::sampledTexture(
+ 3, QRhiShaderResourceBinding::FragmentStage, texture,
+ texture->flags().testFlag(QRhiTexture::Flag::MipMapped) ? samplerNearest
+ : samplerNone));
+
+ data.clear();
+ for (int i = 0; i < 8; ++i) {
+ data.append(char(i * 32));
+ data.append(char(i * 32));
+ data.append(char(0));
+ data.append(char(255));
+ }
+ d.initialUpdates->uploadTexture(
+ texture, QRhiTextureUploadEntry(0, 0, QRhiTextureSubresourceUploadDescription(data)));
+
+ readbackResult = new QRhiReadbackResult;
+ readbackResult->completed = std::bind(readBackCompleted, readbackResult, data);
+ readbackDescription.setTexture(texture);
+ readbackDescription.setLayer(0);
+ readbackDescription.setLevel(0);
+ d.initialUpdates->readBackTexture(readbackDescription, readbackResult);
+
+ QRhiTexture *textureSource = texture;
+ QByteArray textureCopyData = data.mid(data.size() / 2).append(data.mid(0, data.size() / 2));
+
+ if (mipmaps) {
+
+ data.clear();
+ for (int i = 0; i < 4; ++i) {
+ data.append(char(i * 64));
+ data.append(char(i * 64));
+ data.append(char(0));
+ data.append(char(255));
+ }
+ d.initialUpdates->uploadTexture(
+ texture,
+ QRhiTextureUploadEntry(0, 1, QRhiTextureSubresourceUploadDescription(data)));
+
+ readbackResult = new QRhiReadbackResult;
+ readbackResult->completed = std::bind(readBackCompleted, readbackResult, data);
+ readbackDescription.setTexture(texture);
+ readbackDescription.setLayer(0);
+ readbackDescription.setLevel(1);
+ d.initialUpdates->readBackTexture(readbackDescription, readbackResult);
+
+ data.clear();
+ for (int i = 0; i < 2; ++i) {
+ data.append(char(i * 128));
+ data.append(char(i * 128));
+ data.append(char(0));
+ data.append(char(255));
+ }
+ d.initialUpdates->uploadTexture(
+ texture,
+ QRhiTextureUploadEntry(0, 2, QRhiTextureSubresourceUploadDescription(data)));
+
+ readbackResult = new QRhiReadbackResult;
+ readbackResult->completed = std::bind(readBackCompleted, readbackResult, data);
+ readbackDescription.setTexture(texture);
+ readbackDescription.setLayer(0);
+ readbackDescription.setLevel(2);
+ d.initialUpdates->readBackTexture(readbackDescription, readbackResult);
+
+ data.clear();
+ data.append(char(128));
+ data.append(char(128));
+ data.append(char(0));
+ data.append(char(255));
+ d.initialUpdates->uploadTexture(
+ texture,
+ QRhiTextureUploadEntry(0, 3, QRhiTextureSubresourceUploadDescription(data)));
+
+ readbackResult = new QRhiReadbackResult;
+ readbackResult->completed = std::bind(readBackCompleted, readbackResult, data);
+ readbackDescription.setTexture(texture);
+ readbackDescription.setLayer(0);
+ readbackDescription.setLevel(3);
+ d.initialUpdates->readBackTexture(readbackDescription, readbackResult);
+ }
+
+ //
+ // 1D texture array with uploaded mipmaps. Layer 0 contains blue colormap, layer 1 contains
+ // magenta colormap
+ //
+ texture = m_r->newTextureArray(
+ QRhiTexture::Format::RGBA8, 2, QSize(8, 0), 1,
+ QRhiTexture::Flag::TextureArray | QRhiTexture::Flag::OneDimensional
+ | QRhiTexture::Flag::UsedAsTransferSource
+ | (mipmaps ? QRhiTexture::Flag::MipMapped : QRhiTexture::Flag(0)));
+ d.releasePool << texture;
+ texture->create();
+
+ shaderResouceBindings.append(QRhiShaderResourceBinding::sampledTexture(
+ 4, QRhiShaderResourceBinding::FragmentStage, texture,
+ texture->flags().testFlag(QRhiTexture::Flag::MipMapped) ? samplerNearest
+ : samplerNone));
+
+ data.clear();
+ for (int i = 0; i < 8; ++i) {
+ data.append(char(0));
+ data.append(char(0));
+ data.append(char(i * 32));
+ data.append(char(255));
+ }
+ d.initialUpdates->uploadTexture(
+ texture, QRhiTextureUploadEntry(0, 0, QRhiTextureSubresourceUploadDescription(data)));
+
+ readbackResult = new QRhiReadbackResult;
+ readbackResult->completed = std::bind(readBackCompleted, readbackResult, data);
+ readbackDescription.setTexture(texture);
+ readbackDescription.setLayer(0);
+ readbackDescription.setLevel(0);
+ d.initialUpdates->readBackTexture(readbackDescription, readbackResult);
+
+ QRhiTexture *textureArraySource = texture;
+ QList<QByteArray> textureArrayCopyData;
+ textureArrayCopyData.append(data.mid(data.size() / 2).append(data.mid(0, data.size() / 2)));
+
+ if (mipmaps) {
+
+ data.clear();
+ for (int i = 0; i < 4; ++i) {
+ data.append(char(0));
+ data.append(char(0));
+ data.append(char(i * 64));
+ data.append(char(255));
+ }
+ d.initialUpdates->uploadTexture(
+ texture,
+ QRhiTextureUploadEntry(0, 1, QRhiTextureSubresourceUploadDescription(data)));
+
+ readbackResult = new QRhiReadbackResult;
+ readbackResult->completed = std::bind(readBackCompleted, readbackResult, data);
+ readbackDescription.setTexture(texture);
+ readbackDescription.setLayer(0);
+ readbackDescription.setLevel(1);
+ d.initialUpdates->readBackTexture(readbackDescription, readbackResult);
+
+ data.clear();
+ for (int i = 0; i < 2; ++i) {
+ data.append(char(0));
+ data.append(char(0));
+ data.append(char(i * 128));
+ data.append(char(255));
+ }
+ d.initialUpdates->uploadTexture(
+ texture,
+ QRhiTextureUploadEntry(0, 2, QRhiTextureSubresourceUploadDescription(data)));
+
+ readbackResult = new QRhiReadbackResult;
+ readbackResult->completed = std::bind(readBackCompleted, readbackResult, data);
+ readbackDescription.setTexture(texture);
+ readbackDescription.setLayer(0);
+ readbackDescription.setLevel(2);
+ d.initialUpdates->readBackTexture(readbackDescription, readbackResult);
+
+ data.clear();
+ data.append(char(0));
+ data.append(char(0));
+ data.append(char(128));
+ data.append(char(255));
+ d.initialUpdates->uploadTexture(
+ texture,
+ QRhiTextureUploadEntry(0, 3, QRhiTextureSubresourceUploadDescription(data)));
+
+ readbackResult = new QRhiReadbackResult;
+ readbackResult->completed = std::bind(readBackCompleted, readbackResult, data);
+ readbackDescription.setTexture(texture);
+ readbackDescription.setLayer(0);
+ readbackDescription.setLevel(3);
+ d.initialUpdates->readBackTexture(readbackDescription, readbackResult);
+ }
+
+ data.clear();
+ for (int i = 0; i < 8; ++i) {
+ data.append(char(i * 32));
+ data.append(char(0));
+ data.append(char(i * 32));
+ data.append(char(255));
+ }
+ d.initialUpdates->uploadTexture(
+ texture, QRhiTextureUploadEntry(1, 0, QRhiTextureSubresourceUploadDescription(data)));
+
+ readbackResult = new QRhiReadbackResult;
+ readbackResult->completed = std::bind(readBackCompleted, readbackResult, data);
+ readbackDescription.setTexture(texture);
+ readbackDescription.setLayer(1);
+ readbackDescription.setLevel(0);
+ d.initialUpdates->readBackTexture(readbackDescription, readbackResult);
+
+ textureArrayCopyData.append(data.mid(data.size() / 2).append(data.mid(0, data.size() / 2)));
+
+ if (mipmaps) {
+
+ data.clear();
+ for (int i = 0; i < 4; ++i) {
+ data.append(char(i * 64));
+ data.append(char(0));
+ data.append(char(i * 64));
+ data.append(char(255));
+ }
+ d.initialUpdates->uploadTexture(
+ texture,
+ QRhiTextureUploadEntry(1, 1, QRhiTextureSubresourceUploadDescription(data)));
+
+ readbackResult = new QRhiReadbackResult;
+ readbackResult->completed = std::bind(readBackCompleted, readbackResult, data);
+ readbackDescription.setTexture(texture);
+ readbackDescription.setLayer(1);
+ readbackDescription.setLevel(1);
+ d.initialUpdates->readBackTexture(readbackDescription, readbackResult);
+
+ data.clear();
+ for (int i = 0; i < 2; ++i) {
+ data.append(char(i * 128));
+ data.append(char(0));
+ data.append(char(i * 128));
+ data.append(char(255));
+ }
+ d.initialUpdates->uploadTexture(
+ texture,
+ QRhiTextureUploadEntry(1, 2, QRhiTextureSubresourceUploadDescription(data)));
+
+ readbackResult = new QRhiReadbackResult;
+ readbackResult->completed = std::bind(readBackCompleted, readbackResult, data);
+ readbackDescription.setTexture(texture);
+ readbackDescription.setLayer(1);
+ readbackDescription.setLevel(2);
+ d.initialUpdates->readBackTexture(readbackDescription, readbackResult);
+
+ data.clear();
+ data.append(char(128));
+ data.append(char(0));
+ data.append(char(128));
+ data.append(char(255));
+ d.initialUpdates->uploadTexture(
+ texture,
+ QRhiTextureUploadEntry(1, 3, QRhiTextureSubresourceUploadDescription(data)));
+
+ readbackResult = new QRhiReadbackResult;
+ readbackResult->completed = std::bind(readBackCompleted, readbackResult, data);
+ readbackDescription.setTexture(texture);
+ readbackDescription.setLayer(1);
+ readbackDescription.setLevel(3);
+ d.initialUpdates->readBackTexture(readbackDescription, readbackResult);
+ }
+
+ //
+ // 1D Texture loaded from image - contains rainbow colormap
+ //
+ QImage image(256, 1, QImage::Format_RGBA8888);
+ for (int i = 0; i < image.width(); ++i) {
+ float x = float(i) / float(image.width() - 1);
+ if (x < 2.0f / 5.0f) {
+ image.setPixelColor(i, 0, QColor::fromRgbF(1.0f, 5.0f / 2.0f * x, 0.0f));
+ } else if (x < 3.0f / 5.0f) {
+ image.setPixelColor(i, 0, QColor::fromRgbF(-5.0f * x + 3.0f, 1.0f, 0.0f));
+ } else if (x < 4.0f / 5.0f) {
+ image.setPixelColor(i, 0, QColor::fromRgbF(0.0f, -5.0f * x + 4.0f, 5.0f * x - 3.0f));
+ } else {
+ image.setPixelColor(i, 0, QColor::fromRgbF(10.0f / 3.0f * x - 8.0f / 3.0f, 0.0f, 1.0f));
+ }
+ }
+
+ texture = m_r->newTexture(QRhiTexture::Format::RGBA8, image.width(), 0, 0, 1,
+ QRhiTexture::Flag::OneDimensional);
+ d.releasePool << texture;
+ texture->create();
+
+ shaderResouceBindings.append(QRhiShaderResourceBinding::sampledTexture(
+ 5, QRhiShaderResourceBinding::FragmentStage, texture,
+ texture->flags().testFlag(QRhiTexture::Flag::MipMapped) ? samplerNearest
+ : samplerNone));
+
+ d.initialUpdates->uploadTexture(texture, image);
+
+ //
+ // 1D Texture copied
+ //
+ texture = m_r->newTexture(QRhiTexture::Format::RGBA8, 8, 0, 0, 1,
+ QRhiTexture::Flag::OneDimensional
+ | QRhiTexture::Flag::UsedAsTransferSource);
+ d.releasePool << texture;
+ texture->create();
+
+ shaderResouceBindings.append(QRhiShaderResourceBinding::sampledTexture(
+ 6, QRhiShaderResourceBinding::FragmentStage, texture,
+ texture->flags().testFlag(QRhiTexture::Flag::MipMapped) ? samplerNearest
+ : samplerNone));
+
+ QRhiTextureCopyDescription copyDescription;
+ copyDescription.setSourceLayer(0);
+ copyDescription.setSourceLevel(0);
+ copyDescription.setSourceTopLeft(QPoint(4, 0));
+ copyDescription.setDestinationLayer(0);
+ copyDescription.setDestinationLevel(0);
+ copyDescription.setDestinationTopLeft(QPoint(0, 0));
+ copyDescription.setPixelSize(QSize(4, 1));
+
+ d.initialUpdates->copyTexture(texture, textureSource, copyDescription);
+
+ copyDescription.setSourceTopLeft(QPoint(0, 0));
+ copyDescription.setDestinationTopLeft(QPoint(4, 0));
+
+ d.initialUpdates->copyTexture(texture, textureSource, copyDescription);
+
+ readbackResult = new QRhiReadbackResult;
+ readbackResult->completed = std::bind(readBackCompleted, readbackResult, textureCopyData);
+ readbackDescription.setTexture(texture);
+ readbackDescription.setLayer(0);
+ readbackDescription.setLevel(0);
+ d.initialUpdates->readBackTexture(readbackDescription, readbackResult);
+
+ //
+ // 1D Texture array copied
+ //
+ texture = m_r->newTextureArray(QRhiTexture::Format::RGBA8, 2, QSize(8, 0), 1,
+ QRhiTexture::Flag::OneDimensional
+ | QRhiTexture::Flag::UsedAsTransferSource);
+ d.releasePool << texture;
+ texture->create();
+
+ shaderResouceBindings.append(QRhiShaderResourceBinding::sampledTexture(
+ 7, QRhiShaderResourceBinding::FragmentStage, texture,
+ texture->flags().testFlag(QRhiTexture::Flag::MipMapped) ? samplerNearest
+ : samplerNone));
+
+ copyDescription.setSourceLayer(1);
+ copyDescription.setSourceLevel(0);
+ copyDescription.setSourceTopLeft(QPoint(4, 0));
+ copyDescription.setDestinationLayer(0);
+ copyDescription.setDestinationLevel(0);
+ copyDescription.setDestinationTopLeft(QPoint(0, 0));
+ copyDescription.setPixelSize(QSize(4, 1));
+ d.initialUpdates->copyTexture(texture, textureArraySource, copyDescription);
+
+ copyDescription.setSourceTopLeft(QPoint(0, 0));
+ copyDescription.setDestinationTopLeft(QPoint(4, 0));
+ d.initialUpdates->copyTexture(texture, textureArraySource, copyDescription);
+
+ copyDescription.setSourceLayer(0);
+ copyDescription.setDestinationLayer(1);
+ d.initialUpdates->copyTexture(texture, textureArraySource, copyDescription);
+
+ copyDescription.setSourceTopLeft(QPoint(4, 0));
+ copyDescription.setDestinationTopLeft(QPoint(0, 0));
+ d.initialUpdates->copyTexture(texture, textureArraySource, copyDescription);
+
+ readbackResult = new QRhiReadbackResult;
+ readbackResult->completed =
+ std::bind(readBackCompleted, readbackResult, textureArrayCopyData[0]);
+ readbackDescription.setTexture(texture);
+ readbackDescription.setLayer(1);
+ readbackDescription.setLevel(0);
+ d.initialUpdates->readBackTexture(readbackDescription, readbackResult);
+
+ readbackResult = new QRhiReadbackResult;
+ readbackResult->completed =
+ std::bind(readBackCompleted, readbackResult, textureArrayCopyData[1]);
+ readbackDescription.setTexture(texture);
+ readbackDescription.setLayer(0);
+ readbackDescription.setLevel(0);
+ d.initialUpdates->readBackTexture(readbackDescription, readbackResult);
+
+ //
+ // Shader resource bindings
+ //
+ d.srb = m_r->newShaderResourceBindings();
+ d.releasePool << d.srb;
+ d.srb->setBindings(shaderResouceBindings.cbegin(), shaderResouceBindings.cend());
+ d.srb->create();
+
+ //
+ // Pipeline
+ //
+ d.ps = m_r->newGraphicsPipeline();
+ d.releasePool << d.ps;
+ d.ps->setShaderStages(
+ { { QRhiShaderStage::Vertex, getShader(QLatin1String(":/texture1d.vert.qsb")) },
+ { QRhiShaderStage::Fragment, getShader(QLatin1String(":/texture1d.frag.qsb")) } });
+
+ QRhiVertexInputLayout inputLayout;
+ inputLayout.setBindings({ { 4 * sizeof(float) } });
+ inputLayout.setAttributes(
+ { { 0, 0, QRhiVertexInputAttribute::Float2, 0 },
+ { 0, 1, QRhiVertexInputAttribute::Float2, quint32(2 * sizeof(float)) } });
+
+ d.ps->setVertexInputLayout(inputLayout);
+ d.ps->setShaderResourceBindings(d.srb);
+ d.ps->setRenderPassDescriptor(m_rp);
+ d.ps->create();
+}
+
+void Window::customRelease()
+{
+ qDeleteAll(d.releasePool);
+ d.releasePool.clear();
+}
+
+void Window::customRender()
+{
+ QRhiCommandBuffer *cb = m_sc->currentFrameCommandBuffer();
+ QRhiResourceUpdateBatch *u = m_r->nextResourceUpdateBatch();
+
+ if (d.initialUpdates) {
+ u->merge(d.initialUpdates);
+ d.initialUpdates->release();
+ d.initialUpdates = nullptr;
+ }
+
+ u->updateDynamicBuffer(d.uniformBuffer, 0, 4, &d.index);
+ d.index++;
+
+ cb->beginPass(m_sc->currentFrameRenderTarget(), m_clearColor, { 1.0f, 0 }, u);
+ cb->setGraphicsPipeline(d.ps);
+ cb->setShaderResources(d.srb);
+ const QSize outputSizeInPixels = m_sc->currentPixelSize();
+ cb->setViewport(
+ { 0, 0, float(outputSizeInPixels.width()), float(outputSizeInPixels.height()) });
+ QRhiCommandBuffer::VertexInput vbufBinding(d.vertexBuffer, 0);
+ cb->setVertexInput(0, 1, &vbufBinding, d.indexBuffer, 0, QRhiCommandBuffer::IndexUInt16);
+ cb->drawIndexed(6);
+ cb->endPass();
+}