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
|