Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 02f62aa7 authored by Jason Sams's avatar Jason Sams
Browse files

Support reference operations in RS scripts.

Change-Id: I9cb5f3cb71823ab24ca51bf0167a0f52cf0691f9
parent 93af2e48
Loading
Loading
Loading
Loading
+22 −3
Original line number Diff line number Diff line
@@ -239,7 +239,7 @@ static uint32_t SC_allocGetDimFaces(RsAllocation va)
    return a->getType()->getDimFaces();
}

const void * SC_getElementAtX(RsAllocation va, uint32_t x)
static const void * SC_getElementAtX(RsAllocation va, uint32_t x)
{
    const Allocation *a = static_cast<const Allocation *>(va);
    const Type *t = a->getType();
@@ -247,7 +247,7 @@ const void * SC_getElementAtX(RsAllocation va, uint32_t x)
    return &p[t->getElementSizeBytes() * x];
}

const void * SC_getElementAtXY(RsAllocation va, uint32_t x, uint32_t y)
static const void * SC_getElementAtXY(RsAllocation va, uint32_t x, uint32_t y)
{
    const Allocation *a = static_cast<const Allocation *>(va);
    const Type *t = a->getType();
@@ -255,7 +255,7 @@ const void * SC_getElementAtXY(RsAllocation va, uint32_t x, uint32_t y)
    return &p[t->getElementSizeBytes() * (x + y*t->getDimX())];
}

const void * SC_getElementAtXYZ(RsAllocation va, uint32_t x, uint32_t y, uint32_t z)
static const void * SC_getElementAtXYZ(RsAllocation va, uint32_t x, uint32_t y, uint32_t z)
{
    const Allocation *a = static_cast<const Allocation *>(va);
    const Type *t = a->getType();
@@ -263,6 +263,20 @@ const void * SC_getElementAtXYZ(RsAllocation va, uint32_t x, uint32_t y, uint32_
    return &p[t->getElementSizeBytes() * (x + y*t->getDimX())];
}

static void SC_setObject(void **vdst, void * vsrc) {
    static_cast<ObjectBase *>(vsrc)->incSysRef();
    static_cast<ObjectBase *>(vdst[0])->decSysRef();
    *vdst = vsrc;
}
static void SC_clearObject(void **vdst) {
    static_cast<ObjectBase *>(vdst[0])->decSysRef();
    *vdst = NULL;
}
static bool SC_isObject(RsAllocation vsrc) {
    return vsrc != NULL;
}



static void SC_debugF(const char *s, float f) {
    LOGE("%s %f, 0x%08x", s, f, *((int *) (&f)));
@@ -405,6 +419,11 @@ static ScriptCState::SymbolTable_t gSyms[] = {
    { "_Z14rsGetElementAt13rs_allocationjj", (void *)&SC_getElementAtXY },
    { "_Z14rsGetElementAt13rs_allocationjjj", (void *)&SC_getElementAtXYZ },

    { "_Z11rsSetObjectP13rs_allocation13rs_allocation", (void *)&SC_setObject },
    { "_Z13rsClearObjectP13rs_allocation", (void *)&SC_clearObject },
    { "_Z10rsIsObject13rs_allocation", (void *)&SC_isObject },


    // Debug
    { "_Z7rsDebugPKcf", (void *)&SC_debugF },
    { "_Z7rsDebugPKcff", (void *)&SC_debugFv2 },
+71 −0
Original line number Diff line number Diff line
@@ -29,6 +29,77 @@ extern void __attribute__((overloadable))
#include "rs_cl.rsh"
#include "rs_core.rsh"

extern void __attribute__((overloadable))
    rsSetObject(rs_element *dst, rs_element src);
extern void __attribute__((overloadable))
    rsSetObject(rs_type *dst, rs_type src);
extern void __attribute__((overloadable))
    rsSetObject(rs_allocation *dst, rs_allocation src);
extern void __attribute__((overloadable))
    rsSetObject(rs_sampler *dst, rs_sampler src);
extern void __attribute__((overloadable))
    rsSetObject(rs_script *dst, rs_script src);
extern void __attribute__((overloadable))
    rsSetObject(rs_mesh *dst, rs_mesh src);
extern void __attribute__((overloadable))
    rsSetObject(rs_program_fragment *dst, rs_program_fragment src);
extern void __attribute__((overloadable))
    rsSetObject(rs_program_vertex *dst, rs_program_vertex src);
extern void __attribute__((overloadable))
    rsSetObject(rs_program_raster *dst, rs_program_raster src);
extern void __attribute__((overloadable))
    rsSetObject(rs_program_store *dst, rs_program_store src);
extern void __attribute__((overloadable))
    rsSetObject(rs_font *dst, rs_font src);

extern void __attribute__((overloadable))
    rsClearObject(rs_element *dst);
extern void __attribute__((overloadable))
    rsClearObject(rs_type *dst);
extern void __attribute__((overloadable))
    rsClearObject(rs_allocation *dst);
extern void __attribute__((overloadable))
    rsClearObject(rs_sampler *dst);
extern void __attribute__((overloadable))
    rsClearObject(rs_script *dst);
extern void __attribute__((overloadable))
    rsClearObject(rs_mesh *dst);
extern void __attribute__((overloadable))
    rsClearObject(rs_program_fragment *dst);
extern void __attribute__((overloadable))
    rsClearObject(rs_program_vertex *dst);
extern void __attribute__((overloadable))
    rsClearObject(rs_program_raster *dst);
extern void __attribute__((overloadable))
    rsClearObject(rs_program_store *dst);
extern void __attribute__((overloadable))
    rsClearObject(rs_font *dst);

extern bool __attribute__((overloadable))
    rsIsObject(rs_element);
extern bool __attribute__((overloadable))
    rsIsObject(rs_type);
extern bool __attribute__((overloadable))
    rsIsObject(rs_allocation);
extern bool __attribute__((overloadable))
    rsIsObject(rs_sampler);
extern bool __attribute__((overloadable))
    rsIsObject(rs_script);
extern bool __attribute__((overloadable))
    rsIsObject(rs_mesh);
extern bool __attribute__((overloadable))
    rsIsObject(rs_program_fragment);
extern bool __attribute__((overloadable))
    rsIsObject(rs_program_vertex);
extern bool __attribute__((overloadable))
    rsIsObject(rs_program_raster);
extern bool __attribute__((overloadable))
    rsIsObject(rs_program_store);
extern bool __attribute__((overloadable))
    rsIsObject(rs_font);



// Allocations

// Return the rs_allocation associated with a bound data
+12 −11
Original line number Diff line number Diff line
@@ -14,17 +14,18 @@ typedef uint16_t ushort;
typedef uint32_t uint;
typedef uint64_t ulong;

typedef struct { int* p; } __attribute__((packed, aligned(4))) rs_element;
typedef struct { int* p; } __attribute__((packed, aligned(4))) rs_type;
typedef struct { int* p; } __attribute__((packed, aligned(4))) rs_allocation;
typedef struct { int* p; } __attribute__((packed, aligned(4))) rs_sampler;
typedef struct { int* p; } __attribute__((packed, aligned(4))) rs_script;
typedef struct { int* p; } __attribute__((packed, aligned(4))) rs_mesh;
typedef struct { int* p; } __attribute__((packed, aligned(4))) rs_program_fragment;
typedef struct { int* p; } __attribute__((packed, aligned(4))) rs_program_vertex;
typedef struct { int* p; } __attribute__((packed, aligned(4))) rs_program_raster;
typedef struct { int* p; } __attribute__((packed, aligned(4))) rs_program_store;
typedef struct { int* p; } __attribute__((packed, aligned(4))) rs_font;
typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_element;
typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_type;
typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_allocation;
typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_sampler;
typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_script;
typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_mesh;
typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_program_fragment;
typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_program_vertex;
typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_program_raster;
typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_program_store;
typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_font;


typedef float float2 __attribute__((ext_vector_type(2)));
typedef float float3 __attribute__((ext_vector_type(3)));