summaryrefslogtreecommitdiffstats
path: root/src/Runtime/Source/render/Qt3DSRenderTexture2D.h
blob: 29c7c1b4eac41e7cf2c87a348830b99982c63850 (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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/****************************************************************************
**
** Copyright (C) 2008-2012 NVIDIA Corporation.
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt 3D Studio.
**
** $QT_BEGIN_LICENSE:GPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#pragma once
#ifndef QT3DS_RENDER_QT3DS_RENDER_TEXTURE_2D_H
#define QT3DS_RENDER_QT3DS_RENDER_TEXTURE_2D_H
#include "render/Qt3DSRenderBaseTypes.h"
#include "foundation/Qt3DSRefCounted.h"
#include "foundation/Qt3DSOption.h"
#include "foundation/Qt3DSAtomic.h"
#include "render/backends/Qt3DSRenderBackend.h"
#include "render/Qt3DSRenderTextureBase.h"

namespace qt3ds {
namespace render {

    class NVRenderContextImpl;
    class NVRenderTextureSampler;

    class NVRenderTexture2D : public NVRenderTextureBase, public NVRenderImplemented
    {

    private:
        QT3DSU32 m_Width; ///< texture width
        QT3DSU32 m_Height; ///< texture height

    public:
        /**
         * @brief constructor
         *
         * @param[in] context		Pointer to context
         * @param[in] fnd			Pointer to foundation
         * @param[in] texTarget		Texture target
         *
         * @return No return.
         */
        NVRenderTexture2D(
            NVRenderContextImpl &context, NVFoundationBase &fnd,
            NVRenderTextureTargetType::Enum texTarget = NVRenderTextureTargetType::Texture2D);

        virtual ~NVRenderTexture2D();

        // Get the texture details for mipmap level 0 if it was set.
        STextureDetails GetTextureDetails() const override;

        /**
         * @brief Create GL texture object and upload data
         *
         * @param[in] newBuffer			Texture data for level 0
         * @param[in] inMipLevel		Texture level count
         * @param[in] width				Texture width
         * @param[in] height			Texture height
         * @param[in] format			Texture data format
         * @param[in] formaInternal		Texture internal format
         *
         * @return No return.
         */
        virtual void SetTextureData(
            NVDataRef<QT3DSU8> newBuffer, QT3DSU8 inMipLevel, QT3DSU32 width, QT3DSU32 height,
            NVRenderTextureFormats::Enum format,
            NVRenderTextureFormats::Enum formaInternal = NVRenderTextureFormats::Unknown);

        /**
         * @brief Create memory storage for a texture object
         *		  This create a texture storage which is immutable in size and format
         *		  Use this for textures used within compute shaders
         *
         * @param[in] inLevels			Texture level count
         * @param[in] width				Texture width
         * @param[in] height			Texture height
         * @param[in] formaInternal		Texture internal format
         * @param[in] format			Texture data format of dataBuffer
         * @param[in] dataBuffer		Texture data for level 0
         *
         * @return No return.
         */
        virtual void
        SetTextureStorage(QT3DSU32 inLevels, QT3DSU32 width, QT3DSU32 height,
                          NVRenderTextureFormats::Enum formaInternal,
                          NVRenderTextureFormats::Enum format = NVRenderTextureFormats::Unknown,
                          NVDataRef<QT3DSU8> dataBuffer = NVDataRef<QT3DSU8>());

        virtual void SetTextureDataMultisample(QT3DSU32 sampleCount, QT3DSU32 width, QT3DSU32 height,
                                               NVRenderTextureFormats::Enum format);

        bool IsMultisampleTexture() const override
        {
            return (m_TexTarget == NVRenderTextureTargetType::Texture2D_MS);
        }
        QT3DSU32 GetSampleCount() const override { return m_SampleCount; }
        bool IsImmutableTexture() const override { return m_Immutable; }

        // Update a sub-rect of the image.  newBuffer is expected to be a continguous subrect of the
        // image.
        virtual void SetTextureSubData(NVDataRef<QT3DSU8> newBuffer, QT3DSU8 inMipLevel, QT3DSU32 inXOffset,
                                       QT3DSU32 inYOffset, QT3DSU32 inSubImageWidth,
                                       QT3DSU32 inSubImageHeight, NVRenderTextureFormats::Enum format);
        // Generate a set of mipmaps from mipLevel( 0 ).  Uses the graphis layer to do this if
        // possible
        // glGenerateMipmap
        virtual void GenerateMipmaps(NVRenderHint::Enum genType = NVRenderHint::Nicest);

        /**
         * @brief Bind a texture for shader access
         *
         *
         * @return No return.
         */
        void Bind() override;

        QT3DSU32 GetNumMipmaps() override { return m_MaxMipLevel; }

        /**
         * @brief Query if texture needs coordinate swizzle
         *
         * @return texture swizzle mode
         */
        NVRenderTextureSwizzleMode::Enum GetTextureSwizzleMode() override
        {
            // if our backend supports hardware texture swizzle then there is no need for a shader
            // swizzle
            return (m_Backend->GetRenderBackendCap(
                       NVRenderBackend::NVRenderBackendCaps::TexSwizzle))
                ? NVRenderTextureSwizzleMode::NoSwizzle
                : m_Backend->GetTextureSwizzleMode(m_Format);
        }

        // this will be obsolete
        const void *GetImplementationHandle() const override
        {
            return reinterpret_cast<void *>(m_TextureHandle);
        }

        static NVRenderTexture2D *Create(NVRenderContextImpl &context);
    };
}
}

#endif