mirror of
https://github.com/wang-bin/QtAV.git
synced 2026-10-17 04:31:08 +08:00
7d3b3af691
1.Optimize the texture data transfer mechanism based on memory alignment. 2.Adjust the creation timing of the DescriptorPool, moving it from initSwapChainResources to initResources. 3.Add Vulkan color space configuration items to the Player instance.
164 lines
3.3 KiB
C++
164 lines
3.3 KiB
C++
#include "VulkanRenderer.h"
|
|
#include <QCoreApplication>
|
|
#include <QLoggingCategory>
|
|
#include <QResizeEvent>
|
|
#include "VulkanRendererPrivate.h"
|
|
|
|
namespace QtAV
|
|
{
|
|
|
|
Q_LOGGING_CATEGORY(lcVk, "qt.vulkan")
|
|
|
|
VulkanRenderer::VulkanRenderer()
|
|
: VideoRenderer(*new VulkanRendererPrivate)
|
|
{
|
|
setMouseGrabEnabled(true);
|
|
initVulkanInstance();
|
|
setPreferredPixelFormat(VideoFormat::Format_YUV420P);
|
|
}
|
|
|
|
VulkanRenderer::~VulkanRenderer()
|
|
{
|
|
}
|
|
|
|
VideoRendererId VulkanRenderer::id() const
|
|
{
|
|
return VideoRendererId_Vulkan;
|
|
}
|
|
|
|
bool VulkanRenderer::isSupported(VideoFormat::PixelFormat pixfmt) const
|
|
{
|
|
switch (pixfmt)
|
|
{
|
|
case QtAV::VideoFormat::Format_YUV444P:
|
|
case QtAV::VideoFormat::Format_YUV422P:
|
|
case QtAV::VideoFormat::Format_YUV420P:
|
|
case QtAV::VideoFormat::Format_YUV411P:
|
|
case QtAV::VideoFormat::Format_YUV410P:
|
|
return true;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
QWidget* VulkanRenderer::widget()
|
|
{
|
|
DPTR_D(VulkanRenderer);
|
|
|
|
if (!d.widget)
|
|
{
|
|
d.widget = QWidget::createWindowContainer(this);
|
|
}
|
|
|
|
return d.widget;
|
|
}
|
|
|
|
QVulkanWindowRenderer* VulkanRenderer::createRenderer()
|
|
{
|
|
DPTR_D(VulkanRenderer);
|
|
|
|
d.vulkanWindowRenderer = new VulkanWindowRenderer(this);
|
|
return d.vulkanWindowRenderer;
|
|
}
|
|
|
|
bool VulkanRenderer::receiveFrame(const VideoFrame& frame)
|
|
{
|
|
DPTR_D(VulkanRenderer);
|
|
|
|
d.vulkanWindowRenderer->setCurrentFrame(frame);
|
|
updateUi();
|
|
return true;
|
|
}
|
|
|
|
void VulkanRenderer::drawFrame()
|
|
{
|
|
}
|
|
|
|
void VulkanRenderer::updateUi()
|
|
{
|
|
QCoreApplication::instance()->postEvent(this, new QEvent(QEvent::UpdateRequest));
|
|
VideoRenderer::updateUi();
|
|
}
|
|
|
|
void VulkanRenderer::resizeEvent(QResizeEvent* ev)
|
|
{
|
|
DPTR_D(VulkanRenderer);
|
|
|
|
resizeRenderer(ev->size().width(), ev->size().height());
|
|
d.setupAspectRatio();
|
|
QVulkanWindow::resizeEvent(ev);
|
|
}
|
|
|
|
bool VulkanRenderer::onSetBrightness(qreal brightness)
|
|
{
|
|
DPTR_D(VulkanRenderer);
|
|
|
|
d.colorTransform.setBrightness(brightness);
|
|
d.vulkanWindowRenderer->setColorTransformMatrix(d.colorTransform.matrixRef());
|
|
return true;
|
|
}
|
|
|
|
bool VulkanRenderer::onSetContrast(qreal contrast)
|
|
{
|
|
DPTR_D(VulkanRenderer);
|
|
|
|
d.colorTransform.setContrast(contrast);
|
|
d.vulkanWindowRenderer->setColorTransformMatrix(d.colorTransform.matrixRef());
|
|
return true;
|
|
}
|
|
|
|
bool VulkanRenderer::onSetHue(qreal hue)
|
|
{
|
|
DPTR_D(VulkanRenderer);
|
|
|
|
d.colorTransform.setHue(hue);
|
|
d.vulkanWindowRenderer->setColorTransformMatrix(d.colorTransform.matrixRef());
|
|
return true;
|
|
}
|
|
|
|
bool VulkanRenderer::onSetSaturation(qreal saturation)
|
|
{
|
|
DPTR_D(VulkanRenderer);
|
|
|
|
d.colorTransform.setSaturation(saturation);
|
|
d.vulkanWindowRenderer->setColorTransformMatrix(d.colorTransform.matrixRef());
|
|
return true;
|
|
}
|
|
|
|
void VulkanRenderer::onSetOutAspectRatioMode(OutAspectRatioMode mode)
|
|
{
|
|
DPTR_D(VulkanRenderer);
|
|
|
|
d.setupAspectRatio();
|
|
}
|
|
|
|
void VulkanRenderer::onSetOutAspectRatio(qreal ratio)
|
|
{
|
|
DPTR_D(VulkanRenderer);
|
|
|
|
d.setupAspectRatio();
|
|
}
|
|
|
|
bool VulkanRenderer::onSetOrientation(int value)
|
|
{
|
|
DPTR_D(VulkanRenderer);
|
|
|
|
d.setupAspectRatio();
|
|
return true;
|
|
}
|
|
|
|
void VulkanRenderer::initVulkanInstance()
|
|
{
|
|
DPTR_D(VulkanRenderer);
|
|
|
|
#ifdef QT_DEBUG
|
|
QLoggingCategory::setFilterRules(QStringLiteral("qt.vulkan=true"));
|
|
d.vulkanInstance.setLayers(QByteArrayList() << "VK_LAYER_LUNARG_standard_validation");
|
|
#endif // QT_DEBUG
|
|
|
|
d.vulkanInstance.create();
|
|
setVulkanInstance(&d.vulkanInstance);
|
|
}
|
|
} |