blob: 0fb5c4a55adca531569ec73b695d5a278099d0e5 [file] [log] [blame]
#ifndef GLES_MACROS_H
#define GLES_MACROS_H
#if defined(__linux__) || defined(__APPLE__)
#include <mutex>
#include "aemu/base/files/PathUtils.h"
#include "aemu/base/memory/MemoryTracker.h"
#if 0
#define MEM_TRACE_IF(condition, group) \
if ((condition)) { \
static std::once_flag once_flag; \
const std::string func(__FUNCTION__); \
std::call_once(once_flag, [&func]() { \
if (android::base::MemoryTracker::get()) { \
std::string baseName; \
android::base::PathUtils::split(std::string(__FILE__), NULL, &baseName); \
android::base::MemoryTracker::get()->addToGroup( \
group, baseName.r() + ":" + func); \
} \
}); \
}
#else
#define MEM_TRACE_IF(condition, group)
#endif
#else
// windows
#define MEM_TRACE_IF(condition, group)
#endif
#define MEM_TRACE(group) MEM_TRACE_IF(true, group)
#define FAIL_IF(condition, description) if((condition)) { \
fprintf(stderr, "%s:%s:%d error %s\n", __FILE__, __FUNCTION__, __LINE__, description); \
return; \
}
#define RET_AND_FAIL_IF(condition, description, ret) if((condition)) { \
fprintf(stderr, "%s:%s:%d error %s\n", __FILE__, __FUNCTION__, __LINE__, description); \
return ret; \
}
#define GET_CTX() \
MEM_TRACE_IF(strncmp(__FUNCTION__, "gl", 2) == 0, "EMUGL") \
FAIL_IF(!s_eglIface, "null s_eglIface") \
GLEScontext* ctx = s_eglIface->getGLESContext(); \
FAIL_IF(!ctx, "null ctx")
#define GET_CTX_CM() \
MEM_TRACE_IF(strncmp(__FUNCTION__, "gl", 2) == 0, "EMUGL") \
FAIL_IF(!s_eglIface, "null s_eglIface") \
GLEScmContext* ctx = \
static_cast<GLEScmContext*>(s_eglIface->getGLESContext()); \
FAIL_IF(!ctx, "null ctx")
#define GET_CTX_V2() \
MEM_TRACE_IF(strncmp(__FUNCTION__, "gl", 2) == 0, "EMUGL") \
FAIL_IF(!s_eglIface, "null s_eglIface") \
GLESv2Context* ctx = \
static_cast<GLESv2Context*>(s_eglIface->getGLESContext()); \
FAIL_IF(!ctx, "null ctx")
#define GET_CTX_RET(failure_ret) \
MEM_TRACE_IF(strncmp(__FUNCTION__, "gl", 2) == 0, "EMUGL") \
RET_AND_FAIL_IF(!s_eglIface, "null s_eglIface", failure_ret) \
GLEScontext* ctx = s_eglIface->getGLESContext(); \
RET_AND_FAIL_IF(!ctx, "null ctx", failure_ret)
#define GET_CTX_CM_RET(failure_ret) \
MEM_TRACE_IF(strncmp(__FUNCTION__, "gl", 2) == 0, "EMUGL") \
RET_AND_FAIL_IF(!s_eglIface, "null s_eglIface", failure_ret) \
GLEScmContext* ctx = \
static_cast<GLEScmContext*>(s_eglIface->getGLESContext()); \
RET_AND_FAIL_IF(!ctx, "null ctx", failure_ret)
#define GET_CTX_V2_RET(failure_ret) \
MEM_TRACE_IF(strncmp(__FUNCTION__, "gl", 2) == 0, "EMUGL") \
RET_AND_FAIL_IF(!s_eglIface, "null s_eglIface", failure_ret) \
GLESv2Context* ctx = \
static_cast<GLESv2Context*>(s_eglIface->getGLESContext()); \
RET_AND_FAIL_IF(!ctx, "null ctx", failure_ret)
#define SET_ERROR_IF(condition,err) if((condition)) { \
fprintf(stderr, "%s:%s:%d error 0x%x\n", __FILE__, __FUNCTION__, __LINE__, err); \
ctx->setGLerror(err); \
return; \
}
#define RET_AND_SET_ERROR_IF(condition,err,ret) if((condition)) { \
fprintf(stderr, "%s:%s:%d error 0x%x\n", __FILE__, __FUNCTION__, __LINE__, err); \
ctx->setGLerror(err); \
return ret; \
}
#define SET_ERROR_IF_DISPATCHER_NOT_SUPPORT(func) \
SET_ERROR_IF(!ctx->dispatcher().func, GL_INVALID_OPERATION)
#define RET_AND_SET_ERROR_IF_DISPATCHER_NOT_SUPPORT(func, ret) \
RET_AND_SET_ERROR_IF(!ctx->dispatcher().func, GL_INVALID_OPERATION, ret)
// Define the following flag to work around cocos2d rendering bug
// BUG: 119568237
#define TOLERATE_PROGRAM_LINK_ERROR 1
#endif