image_framework_ymj/include/open3d/3rdparty/matdbg/DebugServer.h
2024-12-06 16:25:16 +08:00

116 lines
3.6 KiB
C++
Executable File

/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef MATDBG_DEBUGSERVER_H
#define MATDBG_DEBUGSERVER_H
#include <utils/CString.h>
#include <backend/DriverEnums.h>
#include <tsl/robin_map.h>
class CivetServer;
namespace filament {
namespace matdbg {
/**
* Server-side material debugger.
*
* This class manages an HTTP server and a WebSockets server that listen on a secondary thread. It
* receives material packages from the Filament C++ engine or from a standalone tool such as
* matinfo.
*/
class DebugServer {
public:
DebugServer(backend::Backend backend, int port);
~DebugServer();
/**
* Notifies the debugger that the given material package is being loaded into the engine.
*/
void addMaterial(const utils::CString& name, const void* data, size_t size,
void* userdata = nullptr);
using EditCallback = void(*)(void* userdata, const utils::CString& name, const void*, size_t);
using QueryCallback = void(*)(void* userdata, uint64_t* variants);
/**
* Sets up a callback that allows the Filament engine to listen for shader edits. The callback
* might be triggered from a secondary thread.
*/
void setEditCallback(EditCallback callback) { mEditCallback = callback; }
/**
* Sets up a callback that can ask the Filament engine which shader variants are active. The
* callback might be triggered from a secondary thread.
*/
void setQueryCallback(QueryCallback callback) { mQueryCallback = callback; }
bool isReady() const { return mServer; }
private:
using MaterialKey = uint32_t;
struct MaterialRecord {
void* userdata;
const uint8_t* package;
size_t packageSize;
utils::CString name;
MaterialKey key;
uint64_t activeVariants;
};
const MaterialRecord* getRecord(const MaterialKey& key) const;
void updateActiveVariants();
/**
* Replaces the entire content of a particular shader variant. The given shader index uses the
* same ordering that the variants have within the package.
*/
bool handleEditCommand(const MaterialKey& mat, backend::Backend api, int shaderIndex,
const char* newShaderContent, size_t newShaderLength);
const backend::Backend mBackend;
CivetServer* mServer;
tsl::robin_map<MaterialKey, MaterialRecord> mMaterialRecords;
utils::CString mHtml;
utils::CString mJavascript;
utils::CString mCss;
utils::CString mChunkedMessage;
size_t mChunkedMessageRemaining = 0;
EditCallback mEditCallback = nullptr;
QueryCallback mQueryCallback = nullptr;
class FileRequestHandler* mFileHandler = nullptr;
class RestRequestHandler* mRestHandler = nullptr;
class WebSocketHandler* mWebSocketHandler = nullptr;
friend class FileRequestHandler;
friend class RestRequestHandler;
friend class WebSocketHandler;
};
} // namespace matdbg
} // namespace filament
#endif // MATDBG_DEBUGSERVER_H