aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/scenegraph/coreapi/qsgtexture_p.h
blob: 178bd232658ce30aa9771e76febbfb11f9c0a433 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only

#ifndef QSGTEXTURE_P_H
#define QSGTEXTURE_P_H

//
//  W A R N I N G
//  -------------
//
// This file is not part of the Qt API.  It exists purely as an
// implementation detail.  This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//

#include <QtQuick/private/qtquickglobal_p.h>
#include <private/qobject_p.h>
#include "qsgtexture.h"

QT_BEGIN_NAMESPACE

struct QSGSamplerDescription
{
    QSGTexture::Filtering filtering = QSGTexture::Nearest;
    QSGTexture::Filtering mipmapFiltering = QSGTexture::None;
    QSGTexture::WrapMode horizontalWrap = QSGTexture::ClampToEdge;
    QSGTexture::WrapMode verticalWrap = QSGTexture::ClampToEdge;
    QSGTexture::AnisotropyLevel anisotropylevel = QSGTexture::AnisotropyNone;

    static QSGSamplerDescription fromTexture(QSGTexture *t);
};

Q_DECLARE_TYPEINFO(QSGSamplerDescription, Q_RELOCATABLE_TYPE);

bool operator==(const QSGSamplerDescription &a, const QSGSamplerDescription &b) noexcept;
bool operator!=(const QSGSamplerDescription &a, const QSGSamplerDescription &b) noexcept;
size_t qHash(const QSGSamplerDescription &s, size_t seed = 0) noexcept;

#if QT_CONFIG(opengl)
class Q_QUICK_EXPORT QSGTexturePlatformOpenGL : public QNativeInterface::QSGOpenGLTexture
{
public:
    QSGTexturePlatformOpenGL(QSGTexture *t) : m_texture(t) { }
    QSGTexture *m_texture;

    GLuint nativeTexture() const override;
};
#endif

#ifdef Q_OS_WIN
class Q_QUICK_EXPORT QSGTexturePlatformD3D11 : public QNativeInterface::QSGD3D11Texture
{
public:
    QSGTexturePlatformD3D11(QSGTexture *t) : m_texture(t) { }
    QSGTexture *m_texture;

    void *nativeTexture() const override;
};
class Q_QUICK_EXPORT QSGTexturePlatformD3D12 : public QNativeInterface::QSGD3D12Texture
{
public:
    QSGTexturePlatformD3D12(QSGTexture *t) : m_texture(t) { }
    QSGTexture *m_texture;

    int nativeResourceState() const override;
    void *nativeTexture() const override;
};
#endif

#if QT_CONFIG(metal)
class Q_QUICK_EXPORT QSGTexturePlatformMetal : public QNativeInterface::QSGMetalTexture
{
public:
    QSGTexturePlatformMetal(QSGTexture *t) : m_texture(t) { }
    QSGTexture *m_texture;

    QT_OBJC_PROTOCOL(MTLTexture) nativeTexture() const override;
};
#endif

#if QT_CONFIG(vulkan)
class Q_QUICK_EXPORT QSGTexturePlatformVulkan : public QNativeInterface::QSGVulkanTexture
{
public:
    QSGTexturePlatformVulkan(QSGTexture *t) : m_texture(t) { }
    QSGTexture *m_texture;

    VkImage nativeImage() const override;
    VkImageLayout nativeImageLayout() const override;
};
#endif

class Q_QUICK_EXPORT QSGTexturePrivate : public QObjectPrivate
{
    Q_DECLARE_PUBLIC(QSGTexture)
public:
    QSGTexturePrivate(QSGTexture *t);
    static QSGTexturePrivate *get(QSGTexture *t) { return t->d_func(); }
    void resetDirtySamplerOptions();
    bool hasDirtySamplerOptions() const;

    uint wrapChanged : 1;
    uint filteringChanged : 1;
    uint anisotropyChanged : 1;

    uint horizontalWrap : 2;
    uint verticalWrap : 2;
    uint mipmapMode : 2;
    uint filterMode : 2;
    uint anisotropyLevel: 3;

    // While we could make QSGTexturePrivate implement all the interfaces, we
    // rather choose to use separate objects to avoid clashes in the function
    // names and signatures.
#if QT_CONFIG(opengl)
    QSGTexturePlatformOpenGL m_openglTextureAccessor;
#endif
#ifdef Q_OS_WIN
    QSGTexturePlatformD3D11 m_d3d11TextureAccessor;
    QSGTexturePlatformD3D12 m_d3d12TextureAccessor;
#endif
#if QT_CONFIG(metal)
    QSGTexturePlatformMetal m_metalTextureAccessor;
#endif
#if QT_CONFIG(vulkan)
    QSGTexturePlatformVulkan m_vulkanTextureAccessor;
#endif
};

Q_QUICK_EXPORT bool qsg_safeguard_texture(QSGTexture *);

QT_END_NAMESPACE

#endif // QSGTEXTURE_P_H