载入中...
搜索中...
未找到
GraphicsShaderSurface.cpp
浏览该文件的文档.
1#include <algorithm>
2#include <array>
5
6namespace eve::graphics::vulkan {
8 bool doubleSided) {
9 return rebuildMeshShaderSurface(shader, blend, depthWrite, doubleSided, shader.meshRasterState());
10}
13 if (!valid) return valid;
14 return rebuildMeshShaderSurface(shader, shader.meshBlend, shader.meshDepthWrite, shader.meshDoubleSided, state);
15}
16eve::Result<void> Graphics::rebuildMeshShaderSurface(Shader& shader, BlendMode blend, bool depthWrite, bool doubleSided,
17 const MeshShaderRasterState& raster) {
18 auto found = std::find_if(ownedGpuShaders.begin(), ownedGpuShaders.end(),
19 [&](const auto& g) { return g->owner == &shader; });
20 if (found == ownedGpuShaders.end() || !(*found)->isMesh3D || (*found)->isHair3D || shader.isXray() ||
21 swapchainPassOpen || offscreen3DPassOpen)
23 eve::DiagnosticCode::InvalidArgument, "Expected an owned mesh shader outside frame submission"));
24 const auto& current = shader.meshRasterState();
25 if (shader.meshBlend == blend && shader.meshDepthWrite == depthWrite && shader.meshDoubleSided == doubleSided &&
26 current.depthCompare == raster.depthCompare && current.depthBiasConstant == raster.depthBiasConstant &&
27 current.depthBiasSlope == raster.depthBiasSlope && current.colorWriteMask == raster.colorWriteMask)
29 auto& gpu = **found;
30 std::array<vk::Pipeline, 3> prepared{};
31 try {
32 prepared[0] =
33 createMesh3DStylePipeline(shader.vertexSpirv(), shader.fragmentSpirv(), gpu.pipelineLayout,
34 activeScenePass(), activeSceneSamples(), blend, depthWrite, doubleSided, raster);
35 prepared[1] = createMesh3DStylePipeline(shader.vertexSpirv(), shader.fragmentSpirv(), gpu.pipelineLayout,
36 offscreen3DRenderPass, vk::SampleCountFlagBits::e1, blend, depthWrite,
37 doubleSided, raster);
38 prepared[2] = createMesh3DStylePipeline(shader.vertexSpirv(), shader.fragmentSpirv(), gpu.pipelineLayout,
39 hdrOffscreen3DRenderPass, vk::SampleCountFlagBits::e1, blend,
40 depthWrite, doubleSided, raster);
42 } catch (const std::exception& e) {
43 for (auto pipeline : prepared)
44 if (pipeline) device->destroyPipeline(pipeline);
46 }
47 for (auto pipeline : {gpu.mesh3dPipeline, gpu.mesh3dOffscreenPipeline, gpu.mesh3dHdrOffscreenPipeline})
48 if (pipeline) device->destroyPipeline(pipeline);
49 gpu.mesh3dPipeline = prepared[0];
50 gpu.mesh3dOffscreenPipeline = prepared[1];
51 gpu.mesh3dHdrOffscreenPipeline = prepared[2];
52 shader.meshBlend = blend;
53 shader.meshDepthWrite = depthWrite;
54 shader.meshDoubleSided = doubleSided;
55 shader.meshRaster_ = raster;
56 lastMesh3dPipeline = nullptr;
58}
59} // namespace eve::graphics::vulkan
tensor::Graph g
Definition GpuGraph.cpp:7
float blend
bool valid
bool doubleSided
Shader * shader
bool found
double current
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
Custom GPU program.
Definition Shader.h:39
void waitForSharedGpuResources()
Block until all in-flight GPU work (all frames) has completed.
Definition Graphics.cpp:885
eve::Result< void > configureMeshShaderSurface(Shader &shader, BlendMode blend, bool depthWrite, bool doubleSided) override
Configure mesh shader surface.
eve::Result< void > configureMeshShaderRaster(Shader &shader, const MeshShaderRasterState &state) override
Configure mesh shader raster.
Result< void > validateMeshShaderRasterState(const MeshShaderRasterState &state)
Validate a borrowed value without touching graphics state; safe on any thread.
BlendMode
Render-neutral 2D blend mode shared by graphics-facing modules.
Definition RenderTypes.h:11
Value snapshot of custom mesh rasterization state, independent of blending/culling.