首页 > Android, Graphic > Android的Graphic系统代码分析杂记6

Android的Graphic系统代码分析杂记6

2011-10-19 20:27 星期三    浏览: 8,512    绿 发表评论 阅读评论

库libui.so

源码路径:frameworks/base/libs/ui

 

GraphicBuffer/android_native_buffer_t

GraphicBuffer继承自模板类EGLNativeBase,目的是可以将android_native_buffer_t类型安全地转换为GraphicBuffer,并同时对android_native_buffer_t加入计数引用功能。它使用两种类型的缓冲区,一种是framebuffer,另一种是Pmem,分别通过GraphicBufferAllocator和GraphicBufferMapper来处理,前者使用alloc_device_t的alloc/free来从framebuffer中分配/释放内存,后者使用registerBuffer/unregisterBuffer从pmem中获取内存。

 

class GraphicBuffer
: public EGLNativeBase<
android_native_buffer_t,
GraphicBuffer,
LightRefBase<GraphicBuffer> >, public Flattenable

 

GraphicBufferAllocator使用alloc_device_t,实现了alloc和free两个函数,用于分配和释放内存。GraphicBufferMapper使用gralloc_module_t,实现了registerBuffer/unregisterBuffer和lock/unlock,用于设备文件(如pmem)的内存映射。这些API的实现则是在HAL中由vendor来提供。

 

NativeBuffer/android_native_buffer_tANativeWindowBuffer

NativeBuffer继承自模板类EGLNativeBase,目的是可以将android_native_buffer_t类型安全地转换为NativeBuffer,并同时对android_native_buffer_t加入计数引用功能。

class NativeBuffer
: public EGLNativeBase<
android_native_buffer_t,
NativeBuffer,
LightRefBase<NativeBuffer> >

 

结构体android_native_buffer_t包含了:

//…省略部分前面的代码
struct android_native_base_t common; //版本及魔数等信息

int width; //宽
int height;//高
int stride;//行步长
int format;
int usage;

/* transformation as defined in hardware.h */
uint8_t transform;

uint8_t reserved_bytes[3];//保留字节
void* reserved[1];//保留数据

buffer_handle_t handle;//文件描述符fd信息句柄

void* reserved_proc[8];
} android_native_buffer_t;
#define ANativeWindowBuffer android_native_buffer_t

其中buffer_handle_t类型实际为native_handle:

typedef const native_handle* buffer_handle_t;

结构体native_handle定义如下:

typedef struct
{
int version; /* sizeof(native_handle_t) */
int numFds; /* number of file-descriptors at &data[0] */
int numInts; /* number of ints at &data[numFds] */
int data[0]; /* numFds + numInts ints */
} native_handle_t;

它包含了一个文件描述符和整数数组,文件描述符和整数个数分别是numFds和numInts。

 

 

FramebufferNativeWindow/ANativeWindowandroid_native_window_t

FramebufferNativeWindow(FramebufferNativeWindow.cpp)也继承自模板类EGLNativeBase。同样,目的是可以将ANativeWindow类型安全地转换为FramebufferNativeWindow,并加入计数引用功能。我们可以将FramebufferNativeWindow简单地理解为其本质就是一个ANativeWindow。

 

class FramebufferNativeWindow
: public EGLNativeBase<
ANativeWindow,
FramebufferNativeWindow,
LightRefBase<FramebufferNativeWindow> >

再来看下ANativeWindow,它是一个很重要的类,因此将其代码及其注释都摘下来,它与framebuffer设备紧密联系。

FramebufferNativeWindow用于管理framebuffer,在其构造函数中,会打开framebuffer设备和gralloc设备。在当前的Android实现中,它管理着framebuffer的前后两个缓冲区:front buffer和back buffer。当调用者如surfaceflinger对back buffer绘制完成后,调用它的queueBuffer,则会让它成为front buffer(实际调用framebuffer_device_t.post),从而显示到屏幕上。若需绘制,则首先需调用dequeueBuffer获取back buffer,然后调用lockBuffer上锁后,才能在其上进行绘制操作。

DisplayHardware调用了它。

 

FramebufferNativeWindow被转换为EGLNativeWindowType(实际为一个void*指针)供EGL应用程序开发者调用。调用的API及其实现代码:

 

EGLNativeWindowType android_createDisplaySurface(void)
{
FramebufferNativeWindow* w;
w = new FramebufferNativeWindow();
if (w->getDevice() == NULL) {
// get a ref so it can be destroyed when we exit this block
sp<FramebufferNativeWindow> ref(w);
return NULL;
}
return (EGLNativeWindowType)w;
}

 

下面的代码实例,演示了如何使用android_createDisplaySurface创建一个窗口,并在上面进行操作的过程。实际上,所有使用EGL API进行绘制的代码都要进行下面的调用。

int main(int argc, char** argv)
{
EGLint configAttribs[] = {
EGL_DEPTH_SIZE, 0,
EGL_NONE
};

EGLint majorVersion;
EGLint minorVersion;
EGLContext context;
EGLConfig config;
EGLSurface surface;
EGLint w, h;
EGLDisplay dpy;

EGLNativeWindowType window = android_createDisplaySurface();

dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglInitialize(dpy, &majorVersion, &minorVersion);

status_t err = EGLUtils::selectConfigForNativeWindow(
dpy, configAttribs, window, &config);
if (err) {
fprintf(stderr, “couldn’t find an EGLConfig matching the
creen formatn”);
return 0;
}

surface = eglCreateWindowSurface(dpy, config, window, NULL);
context = eglCreateContext(dpy, config, NULL, NULL);
eglMakeCurrent(dpy, surface, surface, context);
eglQuerySurface(dpy, surface, EGL_WIDTH, &w);
eglQuerySurface(dpy, surface, EGL_HEIGHT, &h);

 

本文链接地址: http://blog.redwolf-soft.com/?p=1418

原创文章,版权©红狼博客所有, 转载随意,但请注明出处。

    分享到:

相关文章:

  • 无相关文章
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
订阅评论
  欢迎参与讨论,请在这里发表您的看法、交流您的观点。