1 /* 2 * Copyright (C) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef OHOS_RENDER_3D_LUME_CUSTOM_RENDER_H 17 #define OHOS_RENDER_3D_LUME_CUSTOM_RENDER_H 18 19 #include <algorithm> 20 #include <vector> 21 #include <string> 22 #include <securec.h> 23 24 #include <3d/intf_graphics_context.h> 25 26 #include <base/math/vector.h> 27 28 #include <core/intf_engine.h> 29 #include <core/log.h> 30 #include <core/namespace.h> 31 32 #include <render/datastore/intf_render_data_store_default_staging.h> 33 #include <render/datastore/intf_render_data_store_manager.h> 34 #include <render/datastore/intf_render_data_store_pod.h> 35 #include <render/datastore/render_data_store_render_pods.h> 36 #include <render/device/intf_gpu_resource_manager.h> 37 #include <render/intf_render_context.h> 38 39 #include "3d_widget_adapter_log.h" 40 #include "custom/shader_input_buffer.h" 41 42 namespace OHOS::Render3D { 43 44 struct CustomRenderInput { 45 CORE_NS::IEngine::Ptr engine_; 46 CORE3D_NS::IGraphicsContext::Ptr graphicsContext_; 47 RENDER_NS::IRenderContext::Ptr renderContext_; 48 CORE_NS::IEcs::Ptr ecs_; 49 uint32_t width_ { 0U }; 50 uint32_t height_ { 0U }; 51 }; 52 53 class LumeCustomRender { 54 public: LumeCustomRender(bool needsFrameCallback)55 LumeCustomRender(bool needsFrameCallback): needsFrameCallback_(needsFrameCallback) {}; 56 virtual ~LumeCustomRender(); 57 58 virtual BASE_NS::vector<RENDER_NS::RenderHandleReference> GetRenderHandles(); 59 void Initialize(const CustomRenderInput& input); 60 void LoadImages(const std::vector<std::string>& imageUris); 61 void RegistorShaderPath(const std::string& shaderPath); 62 virtual bool UpdateShaderInputBuffer(const std::shared_ptr<ShaderInputBuffer>& shaderInputBuffer); 63 void UpdateShaderSpecialization(const std::vector<uint32_t>& values); 64 virtual void OnSizeChange(int32_t width, int32_t height); 65 virtual void OnDrawFrame(); 66 void LoadRenderNodeGraph(const std::string& rngUri, const RENDER_NS::RenderHandleReference& output); 67 void UnloadImages(); 68 void UnloadRenderNodeGraph(); NeedsFrameCallback()69 bool NeedsFrameCallback() 70 { 71 return needsFrameCallback_; 72 } SetScaleInfo(float widthScale,float heightScale)73 void SetScaleInfo(float widthScale, float heightScale) 74 { 75 widthScale_ = widthScale; 76 heightScale_ = heightScale; 77 } 78 protected: 79 float widthScale_ = 1.0f; 80 float heightScale_ = 1.0f; 81 uint32_t width_ = 0U; 82 uint32_t height_ = 0U; 83 84 private: 85 const RENDER_NS::RenderHandleReference GetRenderHandle(); 86 void SetRenderOutput(const RENDER_NS::RenderHandleReference& output); 87 void LoadImage(const std::string& imageUri); 88 void GetDefaultStaging(); 89 void PrepareResolutionInputBuffer(); 90 void DestroyBuffer(); 91 void DestroyDataStorePod(); 92 void DestroyRes(); 93 94 CORE_NS::IEngine::Ptr engine_; 95 CORE3D_NS::IGraphicsContext::Ptr graphicsContext_; 96 RENDER_NS::IRenderContext::Ptr renderContext_; 97 RENDER_NS::IRenderDataStoreDefaultStaging* renderDataStoreDefaultStaging_ { nullptr }; 98 99 RENDER_NS::RenderHandleReference shaderInputBufferHandle_; 100 RENDER_NS::RenderHandleReference resolutionBufferHandle_; 101 RENDER_NS::RenderHandleReference renderHandle_; 102 RENDER_NS::GpuBufferDesc bufferDesc_ { 103 RENDER_NS::CORE_BUFFER_USAGE_UNIFORM_BUFFER_BIT | RENDER_NS::CORE_BUFFER_USAGE_TRANSFER_DST_BIT, 104 RENDER_NS::CORE_MEMORY_PROPERTY_HOST_VISIBLE_BIT | RENDER_NS::CORE_MEMORY_PROPERTY_HOST_COHERENT_BIT, 105 RENDER_NS::CORE_ENGINE_BUFFER_CREATION_DYNAMIC_RING_BUFFER, 0u }; 106 107 CORE_NS::EntityReference envCubeHandle_; 108 CORE_NS::EntityReference bgHandle_; 109 CORE_NS::IEcs::Ptr ecs_; 110 111 bool needsFrameCallback_ = false; 112 std::vector<std::pair<std::string, CORE_NS::EntityReference>> images_; 113 std::shared_ptr<ShaderInputBuffer> shaderInputBuffer_; 114 ShaderInputBuffer resolutionBuffer_; 115 116 const char* const RENDER_DATA_STORE_DEFAULT_STAGING = "RenderDataStoreDefaultStaging"; 117 const char* const RENDER_DATA_STORE_POD = "RenderDataStorePod"; 118 const char* const SPECIALIZATION_TYPE_NAME = "ShaderSpecializationRenderPod"; 119 const char* const SPECIALIZATION_CONFIG_NAME = "ShaderSpecializationConfig"; 120 const char* const IMAGE_NAME = "IMAGE"; 121 const char* const INPUT_BUFFER = "INPUT_BUFFER"; 122 const char* const RESOLUTION_BUFFER = "RESOLUTION_BUFFER"; 123 }; 124 125 } // namespace name 126 127 #endif //OHOS_RENDER_3D_LUME_CUSTOM_RENDER_H 128