Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions Editor/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,27 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
)
endif ()

# ---- begin shaders ---------------------------------------------------------------------------------
GetEngineShaderResources(
NAME Editor
OUTPUT EDITOR_RESOURCES
)

file(GLOB_RECURSE SHADERS Shader/*.es*)
foreach (SHADER ${SHADERS})
get_filename_component(SHADER_ABSOLUTE ${SHADER} ABSOLUTE)
string(REPLACE ${CMAKE_CURRENT_SOURCE_DIR}/Shader ../Shader/Editor COPY_DST ${SHADER_ABSOLUTE})
list(APPEND EDITOR_RESOURCES ${SHADER}->${COPY_DST})
endforeach ()

AddResourcesCopyCommand(
NAME Editor
RES ${EDITOR_RESOURCES}
)
# ---- end shaders -----------------------------------------------------------------------------------


# ---- begin qml -------------------------------------------------------------------------------------
set(EDITOR_QML_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/Qml)
set(EDITOR_RESOURCE_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/Qml/Resource)
get_filename_component(EDITOR_RESOURCE_ROOT_ABSOLUTE ${EDITOR_RESOURCE_ROOT} ABSOLUTE)
Expand Down Expand Up @@ -62,3 +83,4 @@ qt_add_qml_module(
RESOURCES ${RESOURCES}
OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Generated/QmlModule
)
# ---- end qml ---------------------------------------------------------------------------------------
53 changes: 53 additions & 0 deletions Editor/Include/Editor/Widget/GraphicsSampleWidget.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
//
// Created by Kindem on 2025/3/16.
//

#pragma once

#include <QWidget>
#include <QBoxLayout>

#include <Render/ShaderCompiler.h>
#include <Editor/Widget/GraphicsWidget.h>

namespace Editor {
class GraphicsSampleWidget final : public GraphicsWidget {
Q_OBJECT

public:
explicit GraphicsSampleWidget(QWidget* inParent = nullptr);
~GraphicsSampleWidget() override;

protected:
void resizeEvent(QResizeEvent* event) override;

private:
static constexpr uint8_t swapChainTextureNum = 2;

void RecreateSwapChain(uint32_t inWidth, uint32_t inHeight);
void DispatchFrame() const;
void DrawFrame() const;

Common::UniquePtr<RHI::Semaphore> imageReadySemaphore;
Common::UniquePtr<RHI::Semaphore> renderFinishedSemaphore;
Common::UniquePtr<RHI::Fence> frameFence;
Common::UniquePtr<RHI::SwapChain> swapChain;
std::array<RHI::Texture*, 2> swapChainTextures;
std::array<Common::UniquePtr<RHI::TextureView>, 2> swapChainTextureViews;
Render::ShaderCompileOutput vsCompileOutput;
Render::ShaderCompileOutput psCompileOutput;
Common::UniquePtr<RHI::ShaderModule> vsModule;
Common::UniquePtr<RHI::ShaderModule> psModule;
Common::UniquePtr<RHI::BindGroupLayout> bindGroupLayout;
Common::UniquePtr<RHI::PipelineLayout> pipelineLayout;
Common::UniquePtr<RHI::RasterPipeline> pipeline;
Common::UniquePtr<RHI::Buffer> vertexBuffer;
Common::UniquePtr<RHI::BufferView> vertexBufferView;
Common::UniquePtr<RHI::Buffer> uniformBuffer;
Common::UniquePtr<RHI::BufferView> uniformBufferView;
Common::UniquePtr<RHI::BindGroup> bindGroup;
Common::UniquePtr<RHI::CommandBuffer> commandBuffer;
Common::UniquePtr<Common::WorkerThread> drawThread;
std::atomic_bool running;
};
}
32 changes: 32 additions & 0 deletions Editor/Include/Editor/Widget/GraphicsWidget.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//
// Created by Kindem on 2025/3/16.
//

#pragma once

#include <QWidget>
#include <QTimer>

#include <Common/Memory.h>
#include <RHI/RHI.h>

namespace Editor {
class GraphicsWidget : public QWidget {
Q_OBJECT

public:
explicit GraphicsWidget(QWidget* inParent = nullptr);
~GraphicsWidget() override;

RHI::Device& GetDevice() const;
RHI::Surface& GetSurface() const;

protected:
QPaintEngine* paintEngine() const override;

void WaitDeviceIdle() const;

RHI::Device* device;
Common::UniquePtr<RHI::Surface> surface;
};
}
34 changes: 34 additions & 0 deletions Editor/Shader/GraphicsWindowSample.esl
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#include <Platform.esh>

struct FragmentInput {
float4 position : SV_POSITION;
float4 color : COLOR;
};

#if VERTEX_SHADER
cbuffer vsUniform {
float3 vertexColor;
};

FragmentInput VSMain(
uint vertexId : SV_VertexID,
VkLocation(0) float3 position : POSITION)
{
FragmentInput fragmentInput;
fragmentInput.position = float4(position.xyz, 1.0f);
#if VULKAN
fragmentInput.position.y = - fragmentInput.position.y;
#endif

fragmentInput.color = float4(0.0f, 0.0f, 0.0f, 1.0f);
fragmentInput.color[vertexId % 3] = vertexColor[vertexId % 3];
return fragmentInput;
}
#endif

#if PIXEL_SHADER
float4 PSMain(FragmentInput input) : SV_TARGET
{
return input.color;
}
#endif
16 changes: 12 additions & 4 deletions Editor/Src/Main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,22 @@
#include <Editor/Widget/WidgetSamples.h>

#if BUILD_CONFIG_DEBUG
static ::Core::CmdlineArgValue<bool> caRunSample(
#include <Editor/Widget/GraphicsSampleWidget.h>

static Core::CmdlineArgValue<bool> caGraphicsWindowSample(
"graphicsSample", "-graphicsSample", false,
"Whether to run graphics sample instead of editor");

static Core::CmdlineArgValue<bool> caRunSample(
"widgetSamples", "-widgetSamples", false,
"Whether to run widget samples instead of editor");
#endif

static ::Core::CmdlineArgValue<std::string> caRhiType(
static Core::CmdlineArgValue<std::string> caRhiType(
"rhiType", "-rhi", RHI::GetPlatformDefaultRHIAbbrString(),
"rhi abbr string, can be 'dx12' or 'vulkan'");

static ::Core::CmdlineArgValue<std::string> caProjectRoot(
static Core::CmdlineArgValue<std::string> caProjectRoot(
"projectRoot", "-project", "",
"project root path");

Expand Down Expand Up @@ -54,7 +60,9 @@ int main(int argc, char* argv[])

Common::UniquePtr<QWidget> mainWidget;
#if BUILD_CONFIG_DEBUG
if (caRunSample.GetValue()) {
if (caGraphicsWindowSample.GetValue()) {
mainWidget = new Editor::GraphicsSampleWidget();
} else if (caRunSample.GetValue()) {
mainWidget = new Editor::WidgetSamples();
} else
#endif
Expand Down
Loading