Skip to content

Commit

Permalink
wip generator improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
progschj committed Jul 5, 2022
1 parent 284dbec commit 298fc43
Show file tree
Hide file tree
Showing 19 changed files with 297 additions and 453 deletions.
4 changes: 3 additions & 1 deletion code_gen/generate_device_frontend.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ def declare_objects(self):
code += " virtual const char** paramNames() const = 0;\n"
code += " virtual size_t paramCount() const = 0;\n"
code += "};\n"
for obj in self.anari["objects"]:
for idx, obj in enumerate(self.anari["objects"]):
classname = obj["type"][6:].title()
if "name" in obj:
classname += obj["name"][0].upper() + obj["name"][1:]
Expand All @@ -96,6 +96,8 @@ def declare_objects(self):
else:
code += " static constexpr const char *subtype = nullptr;\n"

code += " static const uint32_t id = %d;\n"%idx

for param in obj["parameters"]:
code += " Parameter<" + ", ".join(param["types"]) + "> " + param["name"].replace(".", "_") + ";\n"
code += "\n"
Expand Down
66 changes: 3 additions & 63 deletions code_gen/templates/ArrayObjects.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ static void managed_deleter(const void*, const void *appMemory) {
Object<Array1D>::Object(ANARIDevice d, ANARIObject handle, const void* appMemory,
ANARIMemoryDeleter deleter, const void* userdata, ANARIDataType elementType,
uint64_t numItems1, uint64_t byteStride1)
: ArrayObjectBase(d, handle), staging(d, handle), current(d, handle), appMemory(appMemory), deleter(deleter), userdata(userdata),
: DefaultObject(d, handle), appMemory(appMemory), deleter(deleter), userdata(userdata),
elementType(elementType), numItems1(numItems1), byteStride1(byteStride1)
{
if(this->byteStride1 == 0) {
Expand All @@ -37,26 +37,6 @@ elementType(elementType), numItems1(numItems1), byteStride1(byteStride1)
}
}

bool Object<Array1D>::set(const char *paramname, ANARIDataType type, const void *mem) {
return staging.set(paramname, type, mem);
}
void Object<Array1D>::unset(const char *paramname) {
staging.unset(paramname);
}
void Object<Array1D>::commit() {
current = staging;
}
int Object<Array1D>::getProperty(
const char *propname, ANARIDataType type,
void *mem, uint64_t size, ANARIWaitMask mask)
{
(void)propname;
(void)type;
(void)mem;
(void)size;
(void)mask;
return 0;
}
void* Object<Array1D>::map() {
return const_cast<void*>(appMemory);
}
Expand Down Expand Up @@ -88,7 +68,7 @@ Object<Array2D>::Object(ANARIDevice d, ANARIObject handle, const void* appMemory
ANARIMemoryDeleter deleter, const void* userdata, ANARIDataType elementType,
uint64_t numItems1, uint64_t numItems2,
uint64_t byteStride1, uint64_t byteStride2)
: ArrayObjectBase(d, handle), staging(d, handle), current(d, handle), appMemory(appMemory), deleter(deleter), userdata(userdata),
: DefaultObject(d, handle), appMemory(appMemory), deleter(deleter), userdata(userdata),
elementType(elementType), numItems1(numItems1), numItems2(numItems2),
byteStride1(byteStride1), byteStride2(byteStride2)
{
Expand All @@ -106,26 +86,6 @@ byteStride1(byteStride1), byteStride2(byteStride2)
}
}

bool Object<Array2D>::set(const char *paramname, ANARIDataType type, const void *mem) {
return staging.set(paramname, type, mem);
}
void Object<Array2D>::unset(const char *paramname) {
staging.unset(paramname);
}
void Object<Array2D>::commit() {
current = staging;
}
int Object<Array2D>::getProperty(
const char *propname, ANARIDataType type,
void *mem, uint64_t size, ANARIWaitMask mask)
{
(void)propname;
(void)type;
(void)mem;
(void)size;
(void)mask;
return 0;
}
void* Object<Array2D>::map() {
return const_cast<void*>(appMemory);
}
Expand All @@ -146,7 +106,7 @@ Object<Array3D>::Object(ANARIDevice d, ANARIObject handle, const void* appMemory
ANARIMemoryDeleter deleter, const void* userdata, ANARIDataType elementType,
uint64_t numItems1, uint64_t numItems2, uint64_t numItems3,
uint64_t byteStride1, uint64_t byteStride2, uint64_t byteStride3)
: ArrayObjectBase(d, handle), staging(d, handle), current(d, handle), appMemory(appMemory), deleter(deleter), userdata(userdata),
: DefaultObject(d, handle), appMemory(appMemory), deleter(deleter), userdata(userdata),
elementType(elementType), numItems1(numItems1), numItems2(numItems2), numItems3(numItems3),
byteStride1(byteStride1), byteStride2(byteStride2), byteStride3(byteStride3)
{
Expand All @@ -167,26 +127,6 @@ byteStride1(byteStride1), byteStride2(byteStride2), byteStride3(byteStride3)
}
}

bool Object<Array3D>::set(const char *paramname, ANARIDataType type, const void *mem) {
return staging.set(paramname, type, mem);
}
void Object<Array3D>::unset(const char *paramname) {
staging.unset(paramname);
}
void Object<Array3D>::commit() {
current = staging;
}
int Object<Array3D>::getProperty(
const char *propname, ANARIDataType type,
void *mem, uint64_t size, ANARIWaitMask mask)
{
(void)propname;
(void)type;
(void)mem;
(void)size;
(void)mask;
return 0;
}
void* Object<Array3D>::map() {
return const_cast<void*>(appMemory);
}
Expand Down
39 changes: 3 additions & 36 deletions code_gen/templates/ArrayObjects.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,7 @@
$begin_namespaces

template<>
class Object<Array1D> : public ArrayObjectBase {
Array1D staging;
Array1D current;
class Object<Array1D> : public DefaultObject<Array1D, ArrayObjectBase> {
public:
const void* appMemory;
ANARIMemoryDeleter deleter;
Expand All @@ -27,26 +25,15 @@ class Object<Array1D> : public ArrayObjectBase {
ANARIMemoryDeleter deleter, const void* userdata, ANARIDataType type,
uint64_t numItems1, uint64_t byteStride1);

bool set(const char *paramname, ANARIDataType type, const void *mem) override;
void unset(const char *paramname) override;
void commit() override;
int getProperty(
const char *propname, ANARIDataType type,
void *mem, uint64_t size, ANARIWaitMask mask) override;
void* map() override;
void unmap() override;
void releasePublic() override;
ANARIDataType type() const override { return Array1D::type; }
const char* subtype() const override { return Array1D::subtype; }
ParameterPack& parameters() override { return current; }
const std::vector<ANARIObject>& objects() { return objectArray; }
~Object();
};

template<>
class Object<Array2D> : public ArrayObjectBase {
Array2D staging;
Array2D current;
class Object<Array2D> : public DefaultObject<Array2D, ArrayObjectBase> {
public:
const void* appMemory;
ANARIMemoryDeleter deleter;
Expand All @@ -62,25 +49,14 @@ class Object<Array2D> : public ArrayObjectBase {
uint64_t numItems1, uint64_t numItems2,
uint64_t byteStride1, uint64_t byteStride2);

bool set(const char *paramname, ANARIDataType type, const void *mem) override;
void unset(const char *paramname) override;
void commit() override;
int getProperty(
const char *propname, ANARIDataType type,
void *mem, uint64_t size, ANARIWaitMask mask) override;
void* map() override;
void unmap() override;
void releasePublic() override;
ANARIDataType type() const override { return Array2D::type; }
const char* subtype() const override { return Array2D::subtype; }
ParameterPack& parameters() override { return current; }
~Object();
};

template<>
class Object<Array3D> : public ArrayObjectBase {
Array3D staging;
Array3D current;
class Object<Array3D> : public DefaultObject<Array3D, ArrayObjectBase> {
public:
const void* appMemory;
ANARIMemoryDeleter deleter;
Expand All @@ -98,18 +74,9 @@ class Object<Array3D> : public ArrayObjectBase {
uint64_t numItems1, uint64_t numItems2, uint64_t numItems3,
uint64_t byteStride1, uint64_t byteStride2, uint64_t byteStride3);

bool set(const char *paramname, ANARIDataType type, const void *mem) override;
void unset(const char *paramname) override;
void commit() override;
int getProperty(
const char *propname, ANARIDataType type,
void *mem, uint64_t size, ANARIWaitMask mask) override;
void* map() override;
void unmap() override;
void releasePublic() override;
ANARIDataType type() const override { return Array3D::type; }
const char* subtype() const override { return Array3D::subtype; }
ParameterPack& parameters() override { return current; }
~Object();
};

Expand Down
62 changes: 36 additions & 26 deletions code_gen/templates/Device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,14 @@ int $prefixDevice::deviceImplements(const char *extension) {
}

void * $prefixDevice::mapArray(ANARIArray handle) {
if(auto obj = fromHandle<ArrayObjectBase*>(handle)) {
if(auto obj = handle_cast<ArrayObjectBase*>(handle)) {
return obj->map();
} else {
return nullptr;
}
}
void $prefixDevice::unmapArray(ANARIArray handle) {
if(auto obj = fromHandle<ArrayObjectBase*>(handle)) {
if(auto obj = handle_cast<ArrayObjectBase*>(handle)) {
obj->unmap();
}
}
Expand All @@ -56,7 +56,7 @@ int $prefixDevice::getProperty(ANARIObject handle,
} else {
return 0;
}
} else if(auto obj = fromHandle<ObjectBase*>(handle)) {
} else if(auto obj = handle_cast<ObjectBase*>(handle)) {
return obj->getProperty(name, type, mem, size, mask);
} else {
return 0;
Expand All @@ -67,33 +67,29 @@ void $prefixDevice::setParameter(ANARIObject handle,
const char *name,
ANARIDataType type,
const void *mem) {
if(handle == this_device()) {
staging.set(name, type, mem);
} else if(auto obj = fromHandle<ObjectBase*>(handle)) {
if(auto obj = handle_cast<ObjectBase*>(handle)) {
obj->set(name, type, mem);
}
}

void $prefixDevice::unsetParameter(ANARIObject handle, const char *name) {
if(handle == this_device()) {
staging.unset(name);
} else if(auto obj = fromHandle<ObjectBase*>(handle)) {
if(auto obj = handle_cast<ObjectBase*>(handle)) {
obj->unset(name);
}
}

void $prefixDevice::commit(ANARIObject handle) {
if(auto obj = handle_cast<ObjectBase*>(handle)) {
obj->commit();
}
if(handle == this_device()) {
current = staging;
if(current.statusCallback.get(ANARI_STATUS_CALLBACK, &statusCallback)) {
if(deviceObject.current.statusCallback.get(ANARI_STATUS_CALLBACK, &statusCallback)) {
statusCallbackUserData = nullptr;
current.statusCallbackUserData.get(ANARI_VOID_POINTER, &statusCallbackUserData);
deviceObject.current.statusCallbackUserData.get(ANARI_VOID_POINTER, &statusCallbackUserData);
} else {
statusCallback = defaultStatusCallback();
statusCallbackUserData = defaultStatusCallbackUserPtr();
}
} else if(auto obj = fromHandle<ObjectBase*>(handle)) {
obj->commit();
}
}

Expand All @@ -102,56 +98,56 @@ void $prefixDevice::release(ANARIObject handle) {
if(refcount.fetch_sub(1) == 1) {
delete this;
}
} else if(auto obj = fromHandle<ObjectBase*>(handle)) {
} else if(auto obj = handle_cast<ObjectBase*>(handle)) {
obj->release();
}
}
void $prefixDevice::retain(ANARIObject handle) {
if(handle == this_device()) {
refcount++;
} else if(auto obj = fromHandle<ObjectBase*>(handle)) {
} else if(auto obj = handle_cast<ObjectBase*>(handle)) {
obj->retain();
}
}
void $prefixDevice::releaseInternal(ANARIObject handle, ANARIObject owner) {
if(auto obj = fromHandle<ObjectBase*>(handle)) {
if(auto obj = handle_cast<ObjectBase*>(handle)) {
obj->releaseInternal(owner);
}
}
void $prefixDevice::retainInternal(ANARIObject handle, ANARIObject owner) {
if(auto obj = fromHandle<ObjectBase*>(handle)) {
if(auto obj = handle_cast<ObjectBase*>(handle)) {
obj->retainInternal(owner);
}
}

const void* $prefixDevice::frameBufferMap(ANARIFrame handle, const char *channel) {
if(auto obj = fromHandle<FrameObjectBase*>(handle)) {
if(auto obj = handle_cast<FrameObjectBase*>(handle)) {
return obj->mapFrame(channel);
} else {
return 0;
}
}

void $prefixDevice::frameBufferUnmap(ANARIFrame handle, const char *channel) {
if(auto obj = fromHandle<FrameObjectBase*>(handle)) {
if(auto obj = handle_cast<FrameObjectBase*>(handle)) {
obj->unmapFrame(channel);
}
}

void $prefixDevice::renderFrame(ANARIFrame handle) {
if(auto obj = fromHandle<FrameObjectBase*>(handle)) {
if(auto obj = handle_cast<FrameObjectBase*>(handle)) {
obj->renderFrame();
}
}
int $prefixDevice::frameReady(ANARIFrame handle, ANARIWaitMask mask) {
if(auto obj = fromHandle<FrameObjectBase*>(handle)) {
if(auto obj = handle_cast<FrameObjectBase*>(handle)) {
return obj->frameReady(mask);
} else {
return 0;
}
}
void $prefixDevice::discardFrame(ANARIFrame handle) {
if(auto obj = fromHandle<FrameObjectBase*>(handle)) {
if(auto obj = handle_cast<FrameObjectBase*>(handle)) {
obj->discardFrame();
}
}
Expand All @@ -161,7 +157,7 @@ void $prefixDevice::discardFrame(ANARIFrame handle) {
/////////////////////////////////////////////////////////////////////////////

$prefixDevice::$prefixDevice()
: refcount(1),
: refcount(1), deviceObject(this_device(), this_device()),
staging(this_device(), this_device()),
current(this_device(), this_device())
{
Expand All @@ -171,6 +167,21 @@ void $prefixDevice::discardFrame(ANARIFrame handle) {

}

ObjectBase* $prefixDevice::fromHandle(ANARIObject handle) {
if(handle == static_cast<ANARIObject>(this_device())) {
return &deviceObject;
}

uintptr_t idx = reinterpret_cast<uintptr_t>(handle);

std::lock_guard<std::recursive_mutex> guard(mutex);
if(idx<objects.size()) {
return objects[idx].get();
} else {
return nullptr;
}
}

// query functions
const char ** query_object_types(ANARIDataType type);
const ANARIParameter * query_params(ANARIDataType type, const char *subtype);
Expand Down Expand Up @@ -206,9 +217,8 @@ void anariReportStatus(ANARIDevice handle,

std::vector<char> formattedMessage(size_t(count+1));

va_start(arglist_copy, format);
std::vsnprintf(formattedMessage.data(), size_t(count+1), format, arglist_copy);
va_end( arglist_copy );
va_end(arglist_copy);

d->statusCallback(d->statusCallbackUserData, d->this_device(),
source, sourceType, severity, code, formattedMessage.data());
Expand Down
Loading

0 comments on commit 298fc43

Please sign in to comment.