Implement IO_OUTPUT + SurfaceTexture
Change-Id: Id96fecd6d768196523330c5eda77c4ee86b9bd3c
diff --git a/driver/rsdAllocation.cpp b/driver/rsdAllocation.cpp
index f358f93..324eaf6 100644
--- a/driver/rsdAllocation.cpp
+++ b/driver/rsdAllocation.cpp
@@ -263,6 +263,9 @@
drv->uploadDeferred = true;
}
+ drv->width = alloc->getType()->getDimX();
+ drv->height = alloc->getType()->getDimY();
+
drv->readBackFBO = NULL;
return true;
@@ -371,7 +374,8 @@
if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE) {
UploadToTexture(rsc, alloc);
} else {
- if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET) {
+ if ((alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET) &&
+ ~(alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_IO_OUTPUT)) {
AllocateRenderTarget(rsc, alloc);
}
}
@@ -418,6 +422,7 @@
GRALLOC_USAGE_SW_READ_NEVER | GRALLOC_USAGE_SW_WRITE_OFTEN,
bounds, &dst);
alloc->mHal.drvState.mallocPtr = dst;
+
return true;
}
@@ -426,6 +431,13 @@
//ALOGE("rsdAllocationSetSurfaceTexture %p %p", alloc, nw);
+ if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET) {
+ //TODO finish support for render target + script
+ drv->wnd = nw;
+ return;
+ }
+
+
// Cleanup old surface if there is one.
if (alloc->mHal.state.wndSurface) {
ANativeWindow *old = alloc->mHal.state.wndSurface;
@@ -436,8 +448,15 @@
if (nw != NULL) {
int32_t r;
- r = native_window_set_usage(nw, GRALLOC_USAGE_SW_READ_RARELY |
- GRALLOC_USAGE_SW_WRITE_OFTEN);
+ uint32_t flags = 0;
+ if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_SCRIPT) {
+ flags |= GRALLOC_USAGE_SW_READ_RARELY | GRALLOC_USAGE_SW_WRITE_OFTEN;
+ }
+ if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET) {
+ flags |= GRALLOC_USAGE_HW_RENDER;
+ }
+
+ r = native_window_set_usage(nw, flags);
if (r) {
rsc->setError(RS_ERROR_DRIVER, "Error setting IO output buffer usage.");
return;
@@ -464,15 +483,23 @@
DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
ANativeWindow *nw = alloc->mHal.state.wndSurface;
- GraphicBufferMapper &mapper = GraphicBufferMapper::get();
- mapper.unlock(drv->wndBuffer->handle);
- int32_t r = nw->queueBuffer(nw, drv->wndBuffer);
- if (r) {
- rsc->setError(RS_ERROR_DRIVER, "Error sending IO output buffer.");
+ if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET) {
+ RsdHal *dc = (RsdHal *)rsc->mHal.drv;
+ RSD_CALL_GL(eglSwapBuffers, dc->gl.egl.display, dc->gl.egl.surface);
return;
}
- IoGetBuffer(rsc, alloc, nw);
+ if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_SCRIPT) {
+ GraphicBufferMapper &mapper = GraphicBufferMapper::get();
+ mapper.unlock(drv->wndBuffer->handle);
+ int32_t r = nw->queueBuffer(nw, drv->wndBuffer);
+ if (r) {
+ rsc->setError(RS_ERROR_DRIVER, "Error sending IO output buffer.");
+ return;
+ }
+
+ IoGetBuffer(rsc, alloc, nw);
+ }
}
void rsdAllocationIoReceive(const Context *rsc, Allocation *alloc) {