2 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali/internal/event/rendering/texture-impl.h> // Dali::Internal::Texture
22 #include <dali/integration-api/render-controller.h>
23 #include <dali/internal/event/common/stage-impl.h>
24 #include <dali/internal/update/manager/update-manager.h>
30 TexturePtr Texture::New(TextureType::Type type, Pixel::Format format, unsigned int width, unsigned int height)
32 constexpr auto max_value = std::numeric_limits<uint16_t>::max();
33 DALI_ASSERT_ALWAYS((width < max_value) && (height < max_value) && "Size out of range");
34 TexturePtr texture(new Texture(type, format, ImageDimensions(width, height)));
35 texture->Initialize();
39 TexturePtr Texture::New(NativeImageInterface& nativeImageInterface)
41 TexturePtr texture(new Texture(&nativeImageInterface));
42 texture->Initialize();
44 // Request event processing and update forcely.
45 texture->mEventThreadServices.GetRenderController().RequestProcessEventsOnIdle(true);
46 texture->mEventThreadServices.ForceNextUpdate();
50 Render::Texture* Texture::GetRenderObject() const
55 Texture::Texture(TextureType::Type type, Pixel::Format format, ImageDimensions size)
56 : mEventThreadServices(EventThreadServices::Get()),
57 mRenderObject(nullptr),
65 Texture::Texture(NativeImageInterfacePtr nativeImageInterface)
66 : mEventThreadServices(EventThreadServices::Get()),
67 mRenderObject(nullptr),
68 mNativeImage(nativeImageInterface),
69 mSize(nativeImageInterface->GetWidth(), nativeImageInterface->GetHeight()),
70 mType(TextureType::TEXTURE_2D),
71 mFormat(Pixel::RGB888)
75 void Texture::Initialize()
77 if(EventThreadServices::IsCoreRunning())
81 mRenderObject = new Render::Texture(mNativeImage);
85 mRenderObject = new Render::Texture(mType, mFormat, mSize);
88 OwnerPointer<Render::Texture> transferOwnership(mRenderObject);
89 AddTexture(mEventThreadServices.GetUpdateManager(), transferOwnership);
95 if(EventThreadServices::IsCoreRunning() && mRenderObject)
97 RemoveTexture(mEventThreadServices.GetUpdateManager(), *mRenderObject);
101 bool Texture::Upload(PixelDataPtr pixelData)
103 return Upload(pixelData, 0u, 0u, 0u, 0u, pixelData->GetWidth(), pixelData->GetHeight());
106 bool Texture::Upload(PixelDataPtr pixelData,
109 unsigned int xOffset,
110 unsigned int yOffset,
114 constexpr auto max_value = std::numeric_limits<uint16_t>::max();
115 DALI_ASSERT_ALWAYS(layer < max_value &&
116 mipmap < max_value &&
117 xOffset < max_value &&
118 yOffset < max_value &&
120 height < max_value &&
121 "Parameter value out of range");
124 if(EventThreadServices::IsCoreRunning() && mRenderObject)
128 DALI_LOG_ERROR("OpenGL ES does not support uploading data to native texture\n");
132 unsigned int pixelDataSize = pixelData->GetWidth() * pixelData->GetHeight();
133 if(pixelData->GetBuffer() == nullptr || pixelDataSize == 0)
135 DALI_LOG_ERROR("PixelData is empty\n");
139 Pixel::Format pixelDataFormat = pixelData->GetPixelFormat();
140 if((pixelDataFormat == mFormat) || ((pixelDataFormat == Pixel::RGB888) && (mFormat == Pixel::RGBA8888)))
142 if(pixelDataSize < width * height)
144 DALI_LOG_ERROR("PixelData of an incorrect size when trying to update texture\n");
146 else if((xOffset + width > (mSize.GetWidth() / (1u << mipmap))) ||
147 (yOffset + height > (mSize.GetHeight() / (1u << mipmap))))
149 DALI_LOG_ERROR("Texture update area out of bounds\n");
153 //Parameters are correct. Send message to upload data to the texture
154 UploadParams params = {static_cast<uint16_t>(layer),
155 static_cast<uint16_t>(mipmap),
156 static_cast<uint16_t>(xOffset),
157 static_cast<uint16_t>(yOffset),
158 static_cast<uint16_t>(width),
159 static_cast<uint16_t>(height)};
160 UploadTextureMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, pixelData, params);
162 // Request event processing and update forcely
163 mEventThreadServices.GetRenderController().RequestProcessEventsOnIdle(true);
164 mEventThreadServices.ForceNextUpdate();
171 DALI_LOG_ERROR("Bad format\n");
180 void Texture::GenerateMipmaps()
182 if(EventThreadServices::IsCoreRunning() && mRenderObject)
184 GenerateMipmapsMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject);
188 unsigned int Texture::GetWidth() const
190 return mSize.GetWidth();
193 unsigned int Texture::GetHeight() const
195 return mSize.GetHeight();
198 bool Texture::IsNative() const
200 return mNativeImage != nullptr;
203 bool Texture::ApplyNativeFragmentShader(std::string& shader)
205 bool modified = false;
206 if(mNativeImage != nullptr && !shader.empty())
208 modified = mNativeImage->ApplyNativeFragmentShader(shader);
214 } // namespace Internal