Merge remote-tracking branch 'origin/master' into claude/issue-47
# Conflicts: # interfaces/Crafter.Graphics-UI.cppm # project.cpp
This commit is contained in:
commit
e8f1c7cff9
15 changed files with 732 additions and 39 deletions
|
|
@ -59,6 +59,12 @@ export namespace Crafter {
|
|||
};
|
||||
static_assert(sizeof(UIDispatchHeader) == 48);
|
||||
|
||||
// Reserved `flags` bit (mirrors shaders/ui-shared.glsl::UI_FLAG_CLIP).
|
||||
// FillHeader sets it when the clip rect is narrower than the surface so
|
||||
// the standard shaders can skip the per-pixel clip compares otherwise.
|
||||
// The remaining low bits stay free for user-defined feature flags.
|
||||
inline constexpr std::uint32_t kUIFlagClip = 0x80000000u;
|
||||
|
||||
// ─── fused-dispatch push-constant header (issue #47) ────────────────
|
||||
// Mirrors the PC block in shaders/ui-fused.comp.glsl byte-for-byte: every
|
||||
// member is vec4-aligned, no padding holes, exactly 128 bytes (the
|
||||
|
|
@ -71,7 +77,7 @@ export namespace Crafter {
|
|||
std::uint32_t outImage; // swapchain image heap slot
|
||||
std::uint32_t fontTexture; // font-atlas image slot (text phase)
|
||||
std::uint32_t fontSampler; // font-atlas sampler slot (text phase)
|
||||
std::uint32_t flags; // reserved — keep zeroed
|
||||
std::uint32_t flags; // per-category clip-active bits (0x1 quads .. 0x8 text)
|
||||
std::uint32_t surfaceWidth;
|
||||
std::uint32_t surfaceHeight;
|
||||
std::uint32_t frameIdx;
|
||||
|
|
@ -200,6 +206,18 @@ export namespace Crafter {
|
|||
std::array<float,4> clipRectPx = {0.0f, 0.0f, 1e9f, 1e9f},
|
||||
std::uint32_t flags = 0) const noexcept;
|
||||
|
||||
// Builds the header `flags` word: the caller's user flags with the
|
||||
// reserved kUIFlagClip bit set iff `clipRectPx` does not already cover
|
||||
// the whole surface. When the clip rect spans the surface, the four
|
||||
// per-pixel clip compares in uiResolveScreenPixel can never reject an
|
||||
// in-surface pixel, so the bit stays clear and the shaders skip them.
|
||||
// Static + dimension-parameterised so the decision is unit-testable
|
||||
// without a live Window; FillHeader feeds it the current window size.
|
||||
static std::uint32_t ClipFlags(std::array<float,4> clipRectPx,
|
||||
std::uint32_t surfaceWidth,
|
||||
std::uint32_t surfaceHeight,
|
||||
std::uint32_t flags) noexcept;
|
||||
|
||||
void DispatchQuads(GraphicsCommandBuffer cmd, std::uint32_t bufferSlot, std::uint32_t itemCount,
|
||||
std::array<float,4> clipRectPx = {0.0f, 0.0f, 1e9f, 1e9f});
|
||||
void DispatchCircles(GraphicsCommandBuffer cmd, std::uint32_t bufferSlot, std::uint32_t itemCount,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue