yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Ellie Hermaszewskaformatf65d756bf

master
5.3 KiB191 linesraw
1// slang-artifact-helper.cpp
2#include "slang-artifact-helper.h"
3
4#include "../compiler-core/slang-slice-allocator.h"
5#include "../core/slang-castable.h"
6#include "../core/slang-file-system.h"
7#include "../core/slang-io.h"
8#include "../core/slang-shared-library.h"
9#include "slang-artifact-desc-util.h"
10#include "slang-artifact-impl.h"
11#include "slang-artifact-representation-impl.h"
12#include "slang-artifact-util.h"
13
14namespace Slang
15{
16
17/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!! DefaultArtifactHelper !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
18
19/* static */ DefaultArtifactHelper DefaultArtifactHelper::g_singleton;
20
21SlangResult DefaultArtifactHelper::queryInterface(SlangUUID const& uuid, void** outObject)
22{
23    if (auto intf = getInterface(uuid))
24    {
25        *outObject = intf;
26        return SLANG_OK;
27    }
28    return SLANG_E_NO_INTERFACE;
29}
30
31void* DefaultArtifactHelper::castAs(const Guid& guid)
32{
33    if (auto ptr = getInterface(guid))
34    {
35        return ptr;
36    }
37    return getObject(guid);
38}
39
40void* DefaultArtifactHelper::getInterface(const Guid& guid)
41{
42    if (guid == ISlangUnknown::getTypeGuid() || guid == IArtifactHelper::getTypeGuid())
43    {
44        return static_cast<IArtifactHelper*>(this);
45    }
46    return nullptr;
47}
48
49void* DefaultArtifactHelper::getObject(const Guid& guid)
50{
51    SLANG_UNUSED(guid);
52    return nullptr;
53}
54
55SlangResult DefaultArtifactHelper::createArtifact(
56    const ArtifactDesc& desc,
57    const char* inName,
58    IArtifact** outArtifact)
59{
60    *outArtifact = inName ? Artifact::create(desc, UnownedStringSlice(inName)).detach()
61                          : Artifact::create(desc).detach();
62
63    return SLANG_OK;
64}
65
66ArtifactKind DefaultArtifactHelper::getKindParent(ArtifactKind kind)
67{
68    return getParent(kind);
69}
70UnownedStringSlice DefaultArtifactHelper::getKindName(ArtifactKind kind)
71{
72    return getName(kind);
73}
74bool DefaultArtifactHelper::isKindDerivedFrom(ArtifactKind kind, ArtifactKind base)
75{
76    return isDerivedFrom(kind, base);
77}
78
79ArtifactPayload DefaultArtifactHelper::getPayloadParent(ArtifactPayload payload)
80{
81    return getParent(payload);
82}
83UnownedStringSlice DefaultArtifactHelper::getPayloadName(ArtifactPayload payload)
84{
85    return getName(payload);
86}
87bool DefaultArtifactHelper::isPayloadDerivedFrom(ArtifactPayload payload, ArtifactPayload base)
88{
89    return isDerivedFrom(payload, base);
90}
91
92ArtifactStyle DefaultArtifactHelper::getStyleParent(ArtifactStyle style)
93{
94    return getParent(style);
95}
96UnownedStringSlice DefaultArtifactHelper::getStyleName(ArtifactStyle style)
97{
98    return getName(style);
99}
100bool DefaultArtifactHelper::isStyleDerivedFrom(ArtifactStyle style, ArtifactStyle base)
101{
102    return isDerivedFrom(style, base);
103}
104
105SlangResult DefaultArtifactHelper::createLockFile(
106    const CharSlice& inNameBase,
107    IOSFileArtifactRepresentation** outLockFile)
108{
109    const UnownedStringSlice nameBase =
110        inNameBase.count ? asStringSlice(inNameBase) : UnownedStringSlice("unknown");
111    String lockPath;
112    SLANG_RETURN_ON_FAIL(File::generateTemporary(nameBase, lockPath));
113    *outLockFile = OSFileArtifactRepresentation::create(
114                       IOSFileArtifactRepresentation::Kind::Lock,
115                       lockPath.getUnownedSlice(),
116                       nullptr)
117                       .detach();
118    return SLANG_OK;
119}
120
121SlangResult DefaultArtifactHelper::calcArtifactDescPath(
122    const ArtifactDesc& desc,
123    const char* inBasePath,
124    ISlangBlob** outPath)
125{
126    UnownedStringSlice basePath(inBasePath);
127    StringBuilder path;
128    SLANG_RETURN_ON_FAIL(ArtifactDescUtil::calcPathForDesc(desc, basePath, path));
129    *outPath = StringBlob::moveCreate(path).detach();
130    return SLANG_OK;
131}
132
133SlangResult DefaultArtifactHelper::calcArtifactPath(
134    IArtifact* artifact,
135    const char* inBasePath,
136    ISlangBlob** outPath)
137{
138    UnownedStringSlice basePath(inBasePath);
139    StringBuilder path;
140    SLANG_RETURN_ON_FAIL(ArtifactUtil::calcPath(artifact, basePath, path));
141    *outPath = StringBlob::moveCreate(path).detach();
142    return SLANG_OK;
143}
144
145ArtifactDesc DefaultArtifactHelper::makeDescForCompileTarget(SlangCompileTarget target)
146{
147    return ArtifactDescUtil::makeDescForCompileTarget(target);
148}
149
150void DefaultArtifactHelper::getCastable(ISlangUnknown* unk, ICastable** outCastable)
151{
152    *outCastable = CastableUtil::getCastable(unk).detach();
153}
154
155SlangResult DefaultArtifactHelper::createOSFileArtifactRepresentation(
156    IOSFileArtifactRepresentation::Kind kind,
157    const CharSlice& path,
158    IOSFileArtifactRepresentation* lockFile,
159    IOSFileArtifactRepresentation** outRep)
160{
161    *outRep = OSFileArtifactRepresentation::create(kind, asStringSlice(path), lockFile).detach();
162    return SLANG_OK;
163}
164
165SlangResult DefaultArtifactHelper::createExtFileArtifactRepresentation(
166    const CharSlice& path,
167    ISlangFileSystemExt* system,
168    IExtFileArtifactRepresentation** outRep)
169{
170    *outRep = ExtFileArtifactRepresentation::create(asStringSlice(path), system).detach();
171    return SLANG_OK;
172}
173
174SlangResult DefaultArtifactHelper::createOSFileArtifact(
175    const ArtifactDesc& desc,
176    const CharSlice& path,
177    IArtifact** outArtifact)
178{
179    auto artifact = Artifact::create(desc);
180
181    auto fileRep = new OSFileArtifactRepresentation(
182        IOSFileArtifactRepresentation::Kind::Reference,
183        asStringSlice(path),
184        nullptr);
185    artifact->addRepresentation(fileRep);
186
187    *outArtifact = artifact.detach();
188    return SLANG_OK;
189}
190
191} // namespace Slang