rhi: Enable sampler address mode W in the API

Internally this is already supported by all backends. The frontend was just
not exposing addressW, instead defaulting to the (arbitrarily chosen) ClampToEdge.

Add the parameter to newSampler(), but make it optional, defaulting to the more
natural Repeat (because that's what one would get with OpenGL for WRAP_R by default)

Change-Id: I0b991d8b649db37d4da86ac8e98ab7845601cf67
Reviewed-by: Christian Strømme <christian.stromme@qt.io>
This commit is contained in:
Laszlo Agocs 2020-01-30 09:57:12 +01:00
parent 037369cc4d
commit a5be18cc7d
13 changed files with 71 additions and 48 deletions

View File

@ -2297,11 +2297,10 @@ bool QRhiTexture::buildFrom(QRhiTexture::NativeTexture src)
*/ */
QRhiSampler::QRhiSampler(QRhiImplementation *rhi, QRhiSampler::QRhiSampler(QRhiImplementation *rhi,
Filter magFilter_, Filter minFilter_, Filter mipmapMode_, Filter magFilter_, Filter minFilter_, Filter mipmapMode_,
AddressMode u_, AddressMode v_) AddressMode u_, AddressMode v_, AddressMode w_)
: QRhiResource(rhi), : QRhiResource(rhi),
m_magFilter(magFilter_), m_minFilter(minFilter_), m_mipmapMode(mipmapMode_), m_magFilter(magFilter_), m_minFilter(minFilter_), m_mipmapMode(mipmapMode_),
m_addressU(u_), m_addressV(v_), m_addressU(u_), m_addressV(v_), m_addressW(w_),
m_addressW(QRhiSampler::ClampToEdge),
m_compareOp(QRhiSampler::Never) m_compareOp(QRhiSampler::Never)
{ {
} }
@ -5321,16 +5320,19 @@ QRhiTexture *QRhi::newTexture(QRhiTexture::Format format,
/*! /*!
\return a new sampler with the specified magnification filter \a magFilter, \return a new sampler with the specified magnification filter \a magFilter,
minification filter \a minFilter, mipmapping mode \a mipmapMpde, and S/T minification filter \a minFilter, mipmapping mode \a mipmapMode, and the
addressing modes \a u and \a v. addressing (wrap) modes \a addressU, \a addressV, and \a addressW.
\sa QRhiResource::release() \sa QRhiResource::release()
*/ */
QRhiSampler *QRhi::newSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter, QRhiSampler *QRhi::newSampler(QRhiSampler::Filter magFilter,
QRhiSampler::Filter minFilter,
QRhiSampler::Filter mipmapMode, QRhiSampler::Filter mipmapMode,
QRhiSampler:: AddressMode u, QRhiSampler::AddressMode v) QRhiSampler::AddressMode addressU,
QRhiSampler::AddressMode addressV,
QRhiSampler::AddressMode addressW)
{ {
return d->createSampler(magFilter, minFilter, mipmapMode, u, v); return d->createSampler(magFilter, minFilter, mipmapMode, addressU, addressV, addressW);
} }
/*! /*!

View File

@ -850,7 +850,7 @@ public:
protected: protected:
QRhiSampler(QRhiImplementation *rhi, QRhiSampler(QRhiImplementation *rhi,
Filter magFilter_, Filter minFilter_, Filter mipmapMode_, Filter magFilter_, Filter minFilter_, Filter mipmapMode_,
AddressMode u_, AddressMode v_); AddressMode u_, AddressMode v_, AddressMode w_);
Filter m_magFilter; Filter m_magFilter;
Filter m_minFilter; Filter m_minFilter;
Filter m_mipmapMode; Filter m_mipmapMode;
@ -1474,9 +1474,12 @@ public:
int sampleCount = 1, int sampleCount = 1,
QRhiTexture::Flags flags = QRhiTexture::Flags()); QRhiTexture::Flags flags = QRhiTexture::Flags());
QRhiSampler *newSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter, QRhiSampler *newSampler(QRhiSampler::Filter magFilter,
QRhiSampler::Filter minFilter,
QRhiSampler::Filter mipmapMode, QRhiSampler::Filter mipmapMode,
QRhiSampler::AddressMode u, QRhiSampler::AddressMode v); QRhiSampler::AddressMode addressU,
QRhiSampler::AddressMode addressV,
QRhiSampler::AddressMode addressW = QRhiSampler::Repeat);
QRhiTextureRenderTarget *newTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc, QRhiTextureRenderTarget *newTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc,
QRhiTextureRenderTarget::Flags flags = QRhiTextureRenderTarget::Flags()); QRhiTextureRenderTarget::Flags flags = QRhiTextureRenderTarget::Flags());

View File

@ -85,9 +85,12 @@ public:
const QSize &pixelSize, const QSize &pixelSize,
int sampleCount, int sampleCount,
QRhiTexture::Flags flags) = 0; QRhiTexture::Flags flags) = 0;
virtual QRhiSampler *createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter, virtual QRhiSampler *createSampler(QRhiSampler::Filter magFilter,
QRhiSampler::Filter minFilter,
QRhiSampler::Filter mipmapMode, QRhiSampler::Filter mipmapMode,
QRhiSampler:: AddressMode u, QRhiSampler::AddressMode v) = 0; QRhiSampler:: AddressMode u,
QRhiSampler::AddressMode v,
QRhiSampler::AddressMode w) = 0;
virtual QRhiTextureRenderTarget *createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc, virtual QRhiTextureRenderTarget *createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc,
QRhiTextureRenderTarget::Flags flags) = 0; QRhiTextureRenderTarget::Flags flags) = 0;

View File

@ -527,9 +527,9 @@ QRhiTexture *QRhiD3D11::createTexture(QRhiTexture::Format format, const QSize &p
QRhiSampler *QRhiD3D11::createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter, QRhiSampler *QRhiD3D11::createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter,
QRhiSampler::Filter mipmapMode, QRhiSampler::Filter mipmapMode,
QRhiSampler::AddressMode u, QRhiSampler::AddressMode v) QRhiSampler::AddressMode u, QRhiSampler::AddressMode v, QRhiSampler::AddressMode w)
{ {
return new QD3D11Sampler(this, magFilter, minFilter, mipmapMode, u, v); return new QD3D11Sampler(this, magFilter, minFilter, mipmapMode, u, v, w);
} }
QRhiTextureRenderTarget *QRhiD3D11::createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc, QRhiTextureRenderTarget *QRhiD3D11::createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc,
@ -2768,8 +2768,8 @@ ID3D11UnorderedAccessView *QD3D11Texture::unorderedAccessViewForLevel(int level)
} }
QD3D11Sampler::QD3D11Sampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode, QD3D11Sampler::QD3D11Sampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode,
AddressMode u, AddressMode v) AddressMode u, AddressMode v, AddressMode w)
: QRhiSampler(rhi, magFilter, minFilter, mipmapMode, u, v) : QRhiSampler(rhi, magFilter, minFilter, mipmapMode, u, v, w)
{ {
} }

View File

@ -120,7 +120,7 @@ struct QD3D11Texture : public QRhiTexture
struct QD3D11Sampler : public QRhiSampler struct QD3D11Sampler : public QRhiSampler
{ {
QD3D11Sampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode, QD3D11Sampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode,
AddressMode u, AddressMode v); AddressMode u, AddressMode v, AddressMode w);
~QD3D11Sampler(); ~QD3D11Sampler();
void release() override; void release() override;
bool build() override; bool build() override;
@ -559,9 +559,12 @@ public:
const QSize &pixelSize, const QSize &pixelSize,
int sampleCount, int sampleCount,
QRhiTexture::Flags flags) override; QRhiTexture::Flags flags) override;
QRhiSampler *createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter, QRhiSampler *createSampler(QRhiSampler::Filter magFilter,
QRhiSampler::Filter minFilter,
QRhiSampler::Filter mipmapMode, QRhiSampler::Filter mipmapMode,
QRhiSampler:: AddressMode u, QRhiSampler::AddressMode v) override; QRhiSampler:: AddressMode u,
QRhiSampler::AddressMode v,
QRhiSampler::AddressMode w) override;
QRhiTextureRenderTarget *createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc, QRhiTextureRenderTarget *createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc,
QRhiTextureRenderTarget::Flags flags) override; QRhiTextureRenderTarget::Flags flags) override;

View File

@ -838,9 +838,9 @@ QRhiTexture *QRhiGles2::createTexture(QRhiTexture::Format format, const QSize &p
QRhiSampler *QRhiGles2::createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter, QRhiSampler *QRhiGles2::createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter,
QRhiSampler::Filter mipmapMode, QRhiSampler::Filter mipmapMode,
QRhiSampler::AddressMode u, QRhiSampler::AddressMode v) QRhiSampler::AddressMode u, QRhiSampler::AddressMode v, QRhiSampler::AddressMode w)
{ {
return new QGles2Sampler(this, magFilter, minFilter, mipmapMode, u, v); return new QGles2Sampler(this, magFilter, minFilter, mipmapMode, u, v, w);
} }
QRhiTextureRenderTarget *QRhiGles2::createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc, QRhiTextureRenderTarget *QRhiGles2::createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc,
@ -3626,8 +3626,8 @@ QRhiTexture::NativeTexture QGles2Texture::nativeTexture()
} }
QGles2Sampler::QGles2Sampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode, QGles2Sampler::QGles2Sampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode,
AddressMode u, AddressMode v) AddressMode u, AddressMode v, AddressMode w)
: QRhiSampler(rhi, magFilter, minFilter, mipmapMode, u, v) : QRhiSampler(rhi, magFilter, minFilter, mipmapMode, u, v, w)
{ {
} }

View File

@ -170,7 +170,7 @@ struct QGles2Texture : public QRhiTexture
struct QGles2Sampler : public QRhiSampler struct QGles2Sampler : public QRhiSampler
{ {
QGles2Sampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode, QGles2Sampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode,
AddressMode u, AddressMode v); AddressMode u, AddressMode v, AddressMode w);
~QGles2Sampler(); ~QGles2Sampler();
void release() override; void release() override;
bool build() override; bool build() override;
@ -613,9 +613,12 @@ public:
const QSize &pixelSize, const QSize &pixelSize,
int sampleCount, int sampleCount,
QRhiTexture::Flags flags) override; QRhiTexture::Flags flags) override;
QRhiSampler *createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter, QRhiSampler *createSampler(QRhiSampler::Filter magFilter,
QRhiSampler::Filter minFilter,
QRhiSampler::Filter mipmapMode, QRhiSampler::Filter mipmapMode,
QRhiSampler:: AddressMode u, QRhiSampler::AddressMode v) override; QRhiSampler:: AddressMode u,
QRhiSampler::AddressMode v,
QRhiSampler::AddressMode w) override;
QRhiTextureRenderTarget *createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc, QRhiTextureRenderTarget *createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc,
QRhiTextureRenderTarget::Flags flags) override; QRhiTextureRenderTarget::Flags flags) override;

View File

@ -626,9 +626,9 @@ QRhiTexture *QRhiMetal::createTexture(QRhiTexture::Format format, const QSize &p
QRhiSampler *QRhiMetal::createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter, QRhiSampler *QRhiMetal::createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter,
QRhiSampler::Filter mipmapMode, QRhiSampler::Filter mipmapMode,
QRhiSampler::AddressMode u, QRhiSampler::AddressMode v) QRhiSampler::AddressMode u, QRhiSampler::AddressMode v, QRhiSampler::AddressMode w)
{ {
return new QMetalSampler(this, magFilter, minFilter, mipmapMode, u, v); return new QMetalSampler(this, magFilter, minFilter, mipmapMode, u, v, w);
} }
QRhiTextureRenderTarget *QRhiMetal::createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc, QRhiTextureRenderTarget *QRhiMetal::createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc,
@ -2548,8 +2548,8 @@ id<MTLTexture> QMetalTextureData::viewForLevel(int level)
} }
QMetalSampler::QMetalSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode, QMetalSampler::QMetalSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode,
AddressMode u, AddressMode v) AddressMode u, AddressMode v, AddressMode w)
: QRhiSampler(rhi, magFilter, minFilter, mipmapMode, u, v), : QRhiSampler(rhi, magFilter, minFilter, mipmapMode, u, v, w),
d(new QMetalSamplerData) d(new QMetalSamplerData)
{ {
} }

View File

@ -120,7 +120,7 @@ struct QMetalSamplerData;
struct QMetalSampler : public QRhiSampler struct QMetalSampler : public QRhiSampler
{ {
QMetalSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode, QMetalSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode,
AddressMode u, AddressMode v); AddressMode u, AddressMode v, AddressMode w);
~QMetalSampler(); ~QMetalSampler();
void release() override; void release() override;
bool build() override; bool build() override;
@ -349,9 +349,12 @@ public:
const QSize &pixelSize, const QSize &pixelSize,
int sampleCount, int sampleCount,
QRhiTexture::Flags flags) override; QRhiTexture::Flags flags) override;
QRhiSampler *createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter, QRhiSampler *createSampler(QRhiSampler::Filter magFilter,
QRhiSampler::Filter minFilter,
QRhiSampler::Filter mipmapMode, QRhiSampler::Filter mipmapMode,
QRhiSampler:: AddressMode u, QRhiSampler::AddressMode v) override; QRhiSampler:: AddressMode u,
QRhiSampler::AddressMode v,
QRhiSampler::AddressMode w) override;
QRhiTextureRenderTarget *createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc, QRhiTextureRenderTarget *createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc,
QRhiTextureRenderTarget::Flags flags) override; QRhiTextureRenderTarget::Flags flags) override;

View File

@ -193,9 +193,9 @@ QRhiTexture *QRhiNull::createTexture(QRhiTexture::Format format, const QSize &pi
QRhiSampler *QRhiNull::createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter, QRhiSampler *QRhiNull::createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter,
QRhiSampler::Filter mipmapMode, QRhiSampler::Filter mipmapMode,
QRhiSampler::AddressMode u, QRhiSampler::AddressMode v) QRhiSampler::AddressMode u, QRhiSampler::AddressMode v, QRhiSampler::AddressMode w)
{ {
return new QNullSampler(this, magFilter, minFilter, mipmapMode, u, v); return new QNullSampler(this, magFilter, minFilter, mipmapMode, u, v, w);
} }
QRhiTextureRenderTarget *QRhiNull::createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc, QRhiTextureRenderTarget *QRhiNull::createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc,
@ -645,8 +645,8 @@ bool QNullTexture::buildFrom(QRhiTexture::NativeTexture src)
} }
QNullSampler::QNullSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode, QNullSampler::QNullSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode,
AddressMode u, AddressMode v) AddressMode u, AddressMode v, AddressMode w)
: QRhiSampler(rhi, magFilter, minFilter, mipmapMode, u, v) : QRhiSampler(rhi, magFilter, minFilter, mipmapMode, u, v, w)
{ {
} }

View File

@ -88,7 +88,7 @@ struct QNullTexture : public QRhiTexture
struct QNullSampler : public QRhiSampler struct QNullSampler : public QRhiSampler
{ {
QNullSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode, QNullSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode,
AddressMode u, AddressMode v); AddressMode u, AddressMode v, AddressMode w);
~QNullSampler(); ~QNullSampler();
void release() override; void release() override;
bool build() override; bool build() override;
@ -212,9 +212,12 @@ public:
const QSize &pixelSize, const QSize &pixelSize,
int sampleCount, int sampleCount,
QRhiTexture::Flags flags) override; QRhiTexture::Flags flags) override;
QRhiSampler *createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter, QRhiSampler *createSampler(QRhiSampler::Filter magFilter,
QRhiSampler::Filter minFilter,
QRhiSampler::Filter mipmapMode, QRhiSampler::Filter mipmapMode,
QRhiSampler:: AddressMode u, QRhiSampler::AddressMode v) override; QRhiSampler:: AddressMode u,
QRhiSampler::AddressMode v,
QRhiSampler::AddressMode w) override;
QRhiTextureRenderTarget *createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc, QRhiTextureRenderTarget *createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc,
QRhiTextureRenderTarget::Flags flags) override; QRhiTextureRenderTarget::Flags flags) override;

View File

@ -4046,9 +4046,9 @@ QRhiTexture *QRhiVulkan::createTexture(QRhiTexture::Format format, const QSize &
QRhiSampler *QRhiVulkan::createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter, QRhiSampler *QRhiVulkan::createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter,
QRhiSampler::Filter mipmapMode, QRhiSampler::Filter mipmapMode,
QRhiSampler::AddressMode u, QRhiSampler::AddressMode v) QRhiSampler::AddressMode u, QRhiSampler::AddressMode v, QRhiSampler::AddressMode w)
{ {
return new QVkSampler(this, magFilter, minFilter, mipmapMode, u, v); return new QVkSampler(this, magFilter, minFilter, mipmapMode, u, v, w);
} }
QRhiTextureRenderTarget *QRhiVulkan::createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc, QRhiTextureRenderTarget *QRhiVulkan::createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc,
@ -5543,8 +5543,8 @@ VkImageView QVkTexture::imageViewForLevel(int level)
} }
QVkSampler::QVkSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode, QVkSampler::QVkSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode,
AddressMode u, AddressMode v) AddressMode u, AddressMode v, AddressMode w)
: QRhiSampler(rhi, magFilter, minFilter, mipmapMode, u, v) : QRhiSampler(rhi, magFilter, minFilter, mipmapMode, u, v, w)
{ {
} }

View File

@ -154,7 +154,7 @@ struct QVkTexture : public QRhiTexture
struct QVkSampler : public QRhiSampler struct QVkSampler : public QRhiSampler
{ {
QVkSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode, QVkSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode,
AddressMode u, AddressMode v); AddressMode u, AddressMode v, AddressMode w);
~QVkSampler(); ~QVkSampler();
void release() override; void release() override;
bool build() override; bool build() override;
@ -657,9 +657,12 @@ public:
const QSize &pixelSize, const QSize &pixelSize,
int sampleCount, int sampleCount,
QRhiTexture::Flags flags) override; QRhiTexture::Flags flags) override;
QRhiSampler *createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter, QRhiSampler *createSampler(QRhiSampler::Filter magFilter,
QRhiSampler::Filter minFilter,
QRhiSampler::Filter mipmapMode, QRhiSampler::Filter mipmapMode,
QRhiSampler:: AddressMode u, QRhiSampler::AddressMode v) override; QRhiSampler:: AddressMode u,
QRhiSampler::AddressMode v,
QRhiSampler::AddressMode w) override;
QRhiTextureRenderTarget *createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc, QRhiTextureRenderTarget *createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc,
QRhiTextureRenderTarget::Flags flags) override; QRhiTextureRenderTarget::Flags flags) override;