Teach RenderScriptRuntime about changed context representation.

Summary:
The runtime discovers contexts through RenderScriptRuntime::Capture*()
methods.  These methods see the low-level context representation.
However, the runtime calls APIs that require the high-level context
representation.  Therefore, it needs to call yet another API to find
the high-level representation associated with a given low-level
representation.

Subscribers: lldb-commits

Differential Revision: https://reviews.llvm.org/D32184

llvm-svn: 300727
This commit is contained in:
David Gross 2017-04-19 18:14:21 +00:00
parent ff168c68dc
commit 36d783ebfe
1 changed files with 39 additions and 30 deletions

View File

@ -1810,6 +1810,7 @@ enum ExpressionStrings {
const int jit_max_expr_size = 512; const int jit_max_expr_size = 512;
// Retrieve the string to JIT for the given expression // Retrieve the string to JIT for the given expression
#define JIT_TEMPLATE_CONTEXT "void* ctxt = (void*)rsDebugGetContextWrapper(0x%" PRIx64 "); "
const char *JITTemplate(ExpressionStrings e) { const char *JITTemplate(ExpressionStrings e) {
// Format strings containing the expressions we may need to evaluate. // Format strings containing the expressions we may need to evaluate.
static std::array<const char *, _eExprLast> runtime_expressions = { static std::array<const char *, _eExprLast> runtime_expressions = {
@ -1817,57 +1818,65 @@ const char *JITTemplate(ExpressionStrings e) {
"(int*)_" "(int*)_"
"Z12GetOffsetPtrPKN7android12renderscript10AllocationEjjjj23RsAllocation" "Z12GetOffsetPtrPKN7android12renderscript10AllocationEjjjj23RsAllocation"
"CubemapFace" "CubemapFace"
"(0x%" PRIx64 ", %" PRIu32 ", %" PRIu32 ", %" PRIu32 ", 0, 0)", "(0x%" PRIx64 ", %" PRIu32 ", %" PRIu32 ", %" PRIu32 ", 0, 0)", // eExprGetOffsetPtr
// Type* rsaAllocationGetType(Context*, Allocation*) // Type* rsaAllocationGetType(Context*, Allocation*)
"(void*)rsaAllocationGetType(0x%" PRIx64 ", 0x%" PRIx64 ")", JIT_TEMPLATE_CONTEXT "(void*)rsaAllocationGetType(ctxt, 0x%" PRIx64 ")", // eExprAllocGetType
// rsaTypeGetNativeData(Context*, Type*, void* typeData, size) Pack the // rsaTypeGetNativeData(Context*, Type*, void* typeData, size) Pack the
// data in the following way mHal.state.dimX; mHal.state.dimY; // data in the following way mHal.state.dimX; mHal.state.dimY;
// mHal.state.dimZ; mHal.state.lodCount; mHal.state.faces; mElement; into // mHal.state.dimZ; mHal.state.lodCount; mHal.state.faces; mElement; into
// typeData Need to specify 32 or 64 bit for uint_t since this differs // typeData Need to specify 32 or 64 bit for uint_t since this differs
// between devices // between devices
"uint%" PRIu32 "_t data[6]; (void*)rsaTypeGetNativeData(0x%" PRIx64 JIT_TEMPLATE_CONTEXT
", 0x%" PRIx64 ", data, 6); data[0]", // X dim "uint%" PRIu32 "_t data[6]; (void*)rsaTypeGetNativeData(ctxt"
"uint%" PRIu32 "_t data[6]; (void*)rsaTypeGetNativeData(0x%" PRIx64 ", 0x%" PRIx64 ", data, 6); data[0]", // eExprTypeDimX
", 0x%" PRIx64 ", data, 6); data[1]", // Y dim JIT_TEMPLATE_CONTEXT
"uint%" PRIu32 "_t data[6]; (void*)rsaTypeGetNativeData(0x%" PRIx64 "uint%" PRIu32 "_t data[6]; (void*)rsaTypeGetNativeData(ctxt"
", 0x%" PRIx64 ", data, 6); data[2]", // Z dim ", 0x%" PRIx64 ", data, 6); data[1]", // eExprTypeDimY
"uint%" PRIu32 "_t data[6]; (void*)rsaTypeGetNativeData(0x%" PRIx64 JIT_TEMPLATE_CONTEXT
", 0x%" PRIx64 ", data, 6); data[5]", // Element ptr "uint%" PRIu32 "_t data[6]; (void*)rsaTypeGetNativeData(ctxt"
", 0x%" PRIx64 ", data, 6); data[2]", // eExprTypeDimZ
JIT_TEMPLATE_CONTEXT
"uint%" PRIu32 "_t data[6]; (void*)rsaTypeGetNativeData(ctxt"
", 0x%" PRIx64 ", data, 6); data[5]", // eExprTypeElemPtr
// rsaElementGetNativeData(Context*, Element*, uint32_t* elemData,size) // rsaElementGetNativeData(Context*, Element*, uint32_t* elemData,size)
// Pack mType; mKind; mNormalized; mVectorSize; NumSubElements into // Pack mType; mKind; mNormalized; mVectorSize; NumSubElements into
// elemData // elemData
"uint32_t data[5]; (void*)rsaElementGetNativeData(0x%" PRIx64 JIT_TEMPLATE_CONTEXT
", 0x%" PRIx64 ", data, 5); data[0]", // Type "uint32_t data[5]; (void*)rsaElementGetNativeData(ctxt"
"uint32_t data[5]; (void*)rsaElementGetNativeData(0x%" PRIx64 ", 0x%" PRIx64 ", data, 5); data[0]", // eExprElementType
", 0x%" PRIx64 ", data, 5); data[1]", // Kind JIT_TEMPLATE_CONTEXT
"uint32_t data[5]; (void*)rsaElementGetNativeData(0x%" PRIx64 "uint32_t data[5]; (void*)rsaElementGetNativeData(ctxt"
", 0x%" PRIx64 ", data, 5); data[3]", // Vector Size ", 0x%" PRIx64 ", data, 5); data[1]", // eExprElementKind
"uint32_t data[5]; (void*)rsaElementGetNativeData(0x%" PRIx64 JIT_TEMPLATE_CONTEXT
", 0x%" PRIx64 ", data, 5); data[4]", // Field Count "uint32_t data[5]; (void*)rsaElementGetNativeData(ctxt"
", 0x%" PRIx64 ", data, 5); data[3]", // eExprElementVec
JIT_TEMPLATE_CONTEXT
"uint32_t data[5]; (void*)rsaElementGetNativeData(ctxt"
", 0x%" PRIx64 ", data, 5); data[4]", // eExprElementFieldCount
// rsaElementGetSubElements(RsContext con, RsElement elem, uintptr_t // rsaElementGetSubElements(RsContext con, RsElement elem, uintptr_t
// *ids, const char **names, size_t *arraySizes, uint32_t dataSize) // *ids, const char **names, size_t *arraySizes, uint32_t dataSize)
// Needed for Allocations of structs to gather details about // Needed for Allocations of structs to gather details about
// fields/Subelements Element* of field // fields/Subelements Element* of field
"void* ids[%" PRIu32 "]; const char* names[%" PRIu32 JIT_TEMPLATE_CONTEXT "void* ids[%" PRIu32 "]; const char* names[%" PRIu32
"]; size_t arr_size[%" PRIu32 "];" "]; size_t arr_size[%" PRIu32 "];"
"(void*)rsaElementGetSubElements(0x%" PRIx64 ", 0x%" PRIx64 "(void*)rsaElementGetSubElements(ctxt, 0x%" PRIx64
", ids, names, arr_size, %" PRIu32 "); ids[%" PRIu32 "]", ", ids, names, arr_size, %" PRIu32 "); ids[%" PRIu32 "]", // eExprSubelementsId
// Name of field // Name of field
"void* ids[%" PRIu32 "]; const char* names[%" PRIu32 JIT_TEMPLATE_CONTEXT "void* ids[%" PRIu32 "]; const char* names[%" PRIu32
"]; size_t arr_size[%" PRIu32 "];" "]; size_t arr_size[%" PRIu32 "];"
"(void*)rsaElementGetSubElements(0x%" PRIx64 ", 0x%" PRIx64 "(void*)rsaElementGetSubElements(ctxt, 0x%" PRIx64
", ids, names, arr_size, %" PRIu32 "); names[%" PRIu32 "]", ", ids, names, arr_size, %" PRIu32 "); names[%" PRIu32 "]", // eExprSubelementsName
// Array size of field // Array size of field
"void* ids[%" PRIu32 "]; const char* names[%" PRIu32 JIT_TEMPLATE_CONTEXT "void* ids[%" PRIu32 "]; const char* names[%" PRIu32
"]; size_t arr_size[%" PRIu32 "];" "]; size_t arr_size[%" PRIu32 "];"
"(void*)rsaElementGetSubElements(0x%" PRIx64 ", 0x%" PRIx64 "(void*)rsaElementGetSubElements(ctxt, 0x%" PRIx64
", ids, names, arr_size, %" PRIu32 "); arr_size[%" PRIu32 "]"}}; ", ids, names, arr_size, %" PRIu32 "); arr_size[%" PRIu32 "]"}}; // eExprSubelementsArrSize
return runtime_expressions[e]; return runtime_expressions[e];
} }
@ -1979,8 +1988,8 @@ bool RenderScriptRuntime::JITTypePacked(AllocationDetails *alloc,
for (uint32_t i = 0; i < num_exprs; ++i) { for (uint32_t i = 0; i < num_exprs; ++i) {
const char *fmt_str = JITTemplate(ExpressionStrings(eExprTypeDimX + i)); const char *fmt_str = JITTemplate(ExpressionStrings(eExprTypeDimX + i));
int written = snprintf(expr_bufs[i], jit_max_expr_size, fmt_str, bits, int written = snprintf(expr_bufs[i], jit_max_expr_size, fmt_str,
*alloc->context.get(), *alloc->type_ptr.get()); *alloc->context.get(), bits, *alloc->type_ptr.get());
if (written < 0) { if (written < 0) {
if (log) if (log)
log->Printf("%s - encoding error in snprintf().", __FUNCTION__); log->Printf("%s - encoding error in snprintf().", __FUNCTION__);
@ -2105,7 +2114,7 @@ bool RenderScriptRuntime::JITSubelements(Element &elem,
const char *fmt_str = const char *fmt_str =
JITTemplate(ExpressionStrings(eExprSubelementsId + expr_index)); JITTemplate(ExpressionStrings(eExprSubelementsId + expr_index));
int written = snprintf(expr_buffer, jit_max_expr_size, fmt_str, int written = snprintf(expr_buffer, jit_max_expr_size, fmt_str,
field_count, field_count, field_count, context, context, field_count, field_count, field_count,
*elem.element_ptr.get(), field_count, field_index); *elem.element_ptr.get(), field_count, field_index);
if (written < 0) { if (written < 0) {
if (log) if (log)