#define MSG_PROBE_NETWORK 0x0111
#define MSG_PROBE_GL 0x0112
+#define SCREENSHOT_DIRECTORY "/tmp/da"
+
// TODO: remove this copy-paste
#define CALLER_ADDRESS \
((void*) __builtin_extract_return_addr(__builtin_return_address(0)))
BUF_PTR = pack_int32(BUF_PTR, api_type); \
} while (0)
-#define LOCAL_BUF_SIZE 2048
+
+#define MAX_SHADER_LEN (4 * 1024)
+#define ADD_LOCAL_BUF_SIZE (1024)
+#define MAX_LOCAL_BUF_SIZE (MAX_SHADER_LEN + ADD_LOCAL_BUF_SIZE)
+#define LOCAL_BUF msg_buf
#define PREPARE_LOCAL_BUF() \
- char msg_buf[LOCAL_BUF_SIZE];\
- char *BUF_PTR = msg_buf; \
+ char LOCAL_BUF[MAX_LOCAL_BUF_SIZE]; \
+ char *BUF_PTR = LOCAL_BUF; \
char *RET_PTR = NULL
#define MSG_LEN_OFFSET 16
BUF_PTR = pack_string(BUF_PTR, GL_context_value); \
} while (0)
+#define PACK_GL_SHADER(GL_api_type, GL_elapsed_time, GL_shader, GL_shader_size) \
+ do { /* PACK_GL_SHADER */ \
+ BUF_PTR = pack_int32(BUF_PTR, (uint32_t)GL_api_type); \
+ BUF_PTR = pack_int64(BUF_PTR, (uint64_t)GL_elapsed_time); \
+ if ( (GL_shader_size <= MAX_SHADER_LEN) && \
+ (GL_shader_size <= (sizeof(LOCAL_BUF) - (BUF_PTR - LOCAL_BUF)))) {\
+ /* pack shaders to buffer */ \
+ BUF_PTR = pack_string(BUF_PTR, GL_shader); \
+ } else { \
+ /* pack shaders to file */ \
+ char dst_path[MAX_PATH_LENGTH]; \
+ char dst_path_pack[MAX_PATH_LENGTH]; \
+ FILE *file; \
+ sprintf(dst_path, SCREENSHOT_DIRECTORY "/%d_%d.shd", \
+ getpid(), probeInfo.eventIndex); \
+ file = fopen(dst_path, "w"); \
+ if (file != NULL) { \
+ fwrite(GL_shader, GL_shader_size, 1, file); \
+ fclose(file); \
+ } \
+ sprintf(dst_path_pack, "FILE:%s", dst_path); \
+ BUF_PTR = pack_string(BUF_PTR, dst_path_pack); \
+ } \
+ } while (0)
#define BEFORE(FUNCNAME) \
DECLARE_VARIABLE_STANDARD_NORET; \
error = glGetError(); \
}
+#define AFTER_SHADER(RET_TYPE, RET_VAL, APITYPE, CONTEXT_VAL, CONTEXT_SIZE, INPUTFORMAT, ...) \
+ POST_PACK_PROBEBLOCK_BEGIN(); \
+ PREPARE_LOCAL_BUF(); \
+ PACK_COMMON_BEGIN(MSG_PROBE_GL, vAPI_ID, INPUTFORMAT, __VA_ARGS__); \
+ PACK_COMMON_END(RET_TYPE, RET_VAL, error, blockresult); \
+ PACK_GL_SHADER(APITYPE, get_current_nsec() - start_nsec, CONTEXT_VAL, CONTEXT_SIZE); \
+ FLUSH_LOCAL_BUF(); \
+ POST_PACK_PROBEBLOCK_END()
+
#endif /* DA_GLES20_H_ */
glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, length);
char buf[length[0]];
glGetShaderSource(shader, length[0], NULL, buf);
- AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, buf,
- "ddpp", shader, count,
- voidp_to_uint64(string), voidp_to_uint64(length));
+ AFTER_SHADER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, buf,
+ length[0], "ddpp", shader, count,
+ voidp_to_uint64(string), voidp_to_uint64(length));
} else {
AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "",
"ddpp", shader, count,