summaryrefslogtreecommitdiff
path: root/libs/gui/Surface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/gui/Surface.cpp')
-rw-r--r--libs/gui/Surface.cpp510
1 files changed, 70 insertions, 440 deletions
diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp
index 353a91d062..cf269b33ba 100644
--- a/libs/gui/Surface.cpp
+++ b/libs/gui/Surface.cpp
@@ -34,9 +34,9 @@
#include <utils/NativeHandle.h>
#include <ui/DisplayStatInfo.h>
-#include <ui/DynamicDisplayInfo.h>
#include <ui/Fence.h>
#include <ui/GraphicBuffer.h>
+#include <ui/HdrCapabilities.h>
#include <ui/Region.h>
#include <gui/BufferItem.h>
@@ -48,6 +48,7 @@
namespace android {
+using ui::ColorMode;
using ui::Dataspace;
namespace {
@@ -62,15 +63,13 @@ bool isInterceptorRegistrationOp(int op) {
} // namespace
-Surface::Surface(const sp<IGraphicBufferProducer>& bufferProducer, bool controlledByApp,
- const sp<IBinder>& surfaceControlHandle)
+Surface::Surface(const sp<IGraphicBufferProducer>& bufferProducer, bool controlledByApp)
: mGraphicBufferProducer(bufferProducer),
mCrop(Rect::EMPTY_RECT),
mBufferAge(0),
mGenerationNumber(0),
mSharedBufferMode(false),
mAutoRefresh(false),
- mAutoPrerotation(false),
mSharedBufferSlot(BufferItem::INVALID_BUFFER_SLOT),
mSharedBufferHasBeenQueued(false),
mQueriedSupportedTimestamps(false),
@@ -112,7 +111,6 @@ Surface::Surface(const sp<IGraphicBufferProducer>& bufferProducer, bool controll
mProducerControlledByApp = controlledByApp;
mSwapIntervalZero = false;
mMaxBufferCount = NUM_BUFFER_SLOTS;
- mSurfaceControlHandle = surfaceControlHandle;
}
Surface::~Surface() {
@@ -361,12 +359,15 @@ status_t Surface::getHdrSupport(bool* supported) {
return NAME_NOT_FOUND;
}
- ui::DynamicDisplayInfo info;
- if (status_t err = composerService()->getDynamicDisplayInfo(display, &info); err != NO_ERROR) {
+ HdrCapabilities hdrCapabilities;
+ status_t err =
+ composerService()->getHdrCapabilities(display, &hdrCapabilities);
+
+ if (err)
return err;
- }
- *supported = !info.hdrCapabilities.getSupportedHdrTypes().empty();
+ *supported = !hdrCapabilities.getSupportedHdrTypes().empty();
+
return NO_ERROR;
}
@@ -615,31 +616,29 @@ private:
std::mutex mMutex;
};
-void Surface::getDequeueBufferInputLocked(
- IGraphicBufferProducer::DequeueBufferInput* dequeueInput) {
- LOG_ALWAYS_FATAL_IF(dequeueInput == nullptr, "input is null");
-
- dequeueInput->width = mReqWidth ? mReqWidth : mUserWidth;
- dequeueInput->height = mReqHeight ? mReqHeight : mUserHeight;
-
- dequeueInput->format = mReqFormat;
- dequeueInput->usage = mReqUsage;
-
- dequeueInput->getTimestamps = mEnableFrameTimestamps;
-}
-
int Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) {
ATRACE_CALL();
ALOGV("Surface::dequeueBuffer");
- IGraphicBufferProducer::DequeueBufferInput dqInput;
+ uint32_t reqWidth;
+ uint32_t reqHeight;
+ PixelFormat reqFormat;
+ uint64_t reqUsage;
+ bool enableFrameTimestamps;
+
{
Mutex::Autolock lock(mMutex);
if (mReportRemovedBuffers) {
mRemovedBuffers.clear();
}
- getDequeueBufferInputLocked(&dqInput);
+ reqWidth = mReqWidth ? mReqWidth : mUserWidth;
+ reqHeight = mReqHeight ? mReqHeight : mUserHeight;
+
+ reqFormat = mReqFormat;
+ reqUsage = mReqUsage;
+
+ enableFrameTimestamps = mEnableFrameTimestamps;
if (mSharedBufferMode && mAutoRefresh && mSharedBufferSlot !=
BufferItem::INVALID_BUFFER_SLOT) {
@@ -657,17 +656,16 @@ int Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) {
nsecs_t startTime = systemTime();
FrameEventHistoryDelta frameTimestamps;
- status_t result = mGraphicBufferProducer->dequeueBuffer(&buf, &fence, dqInput.width,
- dqInput.height, dqInput.format,
- dqInput.usage, &mBufferAge,
- dqInput.getTimestamps ?
- &frameTimestamps : nullptr);
+ status_t result = mGraphicBufferProducer->dequeueBuffer(&buf, &fence, reqWidth, reqHeight,
+ reqFormat, reqUsage, &mBufferAge,
+ enableFrameTimestamps ? &frameTimestamps
+ : nullptr);
mLastDequeueDuration = systemTime() - startTime;
if (result < 0) {
ALOGV("dequeueBuffer: IGraphicBufferProducer::dequeueBuffer"
"(%d, %d, %d, %#" PRIx64 ") failed: %d",
- dqInput.width, dqInput.height, dqInput.format, dqInput.usage, result);
+ reqWidth, reqHeight, reqFormat, reqUsage, result);
return result;
}
@@ -696,7 +694,7 @@ int Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) {
freeAllBuffers();
}
- if (dqInput.getTimestamps) {
+ if (enableFrameTimestamps) {
mFrameEventHistory->applyDelta(frameTimestamps);
}
@@ -734,178 +732,6 @@ int Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) {
mSharedBufferHasBeenQueued = false;
}
- mDequeuedSlots.insert(buf);
-
- return OK;
-}
-
-int Surface::dequeueBuffers(std::vector<BatchBuffer>* buffers) {
- using DequeueBufferInput = IGraphicBufferProducer::DequeueBufferInput;
- using DequeueBufferOutput = IGraphicBufferProducer::DequeueBufferOutput;
- using CancelBufferInput = IGraphicBufferProducer::CancelBufferInput;
- using RequestBufferOutput = IGraphicBufferProducer::RequestBufferOutput;
-
- ATRACE_CALL();
- ALOGV("Surface::dequeueBuffers");
-
- if (buffers->size() == 0) {
- ALOGE("%s: must dequeue at least 1 buffer!", __FUNCTION__);
- return BAD_VALUE;
- }
-
- if (mSharedBufferMode) {
- ALOGE("%s: batch operation is not supported in shared buffer mode!",
- __FUNCTION__);
- return INVALID_OPERATION;
- }
-
- size_t numBufferRequested = buffers->size();
- DequeueBufferInput input;
-
- {
- Mutex::Autolock lock(mMutex);
- if (mReportRemovedBuffers) {
- mRemovedBuffers.clear();
- }
-
- getDequeueBufferInputLocked(&input);
- } // Drop the lock so that we can still touch the Surface while blocking in IGBP::dequeueBuffers
-
- std::vector<DequeueBufferInput> dequeueInput(numBufferRequested, input);
- std::vector<DequeueBufferOutput> dequeueOutput;
-
- nsecs_t startTime = systemTime();
-
- status_t result = mGraphicBufferProducer->dequeueBuffers(dequeueInput, &dequeueOutput);
-
- mLastDequeueDuration = systemTime() - startTime;
-
- if (result < 0) {
- ALOGV("%s: IGraphicBufferProducer::dequeueBuffers"
- "(%d, %d, %d, %#" PRIx64 ") failed: %d",
- __FUNCTION__, input.width, input.height, input.format, input.usage, result);
- return result;
- }
-
- std::vector<CancelBufferInput> cancelBufferInputs(numBufferRequested);
- std::vector<status_t> cancelBufferOutputs;
- for (size_t i = 0; i < numBufferRequested; i++) {
- cancelBufferInputs[i].slot = dequeueOutput[i].slot;
- cancelBufferInputs[i].fence = dequeueOutput[i].fence;
- }
-
- for (const auto& output : dequeueOutput) {
- if (output.result < 0) {
- mGraphicBufferProducer->cancelBuffers(cancelBufferInputs, &cancelBufferOutputs);
- ALOGV("%s: IGraphicBufferProducer::dequeueBuffers"
- "(%d, %d, %d, %#" PRIx64 ") failed: %d",
- __FUNCTION__, input.width, input.height, input.format, input.usage,
- output.result);
- return output.result;
- }
-
- if (output.slot < 0 || output.slot >= NUM_BUFFER_SLOTS) {
- mGraphicBufferProducer->cancelBuffers(cancelBufferInputs, &cancelBufferOutputs);
- ALOGE("%s: IGraphicBufferProducer returned invalid slot number %d",
- __FUNCTION__, output.slot);
- android_errorWriteLog(0x534e4554, "36991414"); // SafetyNet logging
- return FAILED_TRANSACTION;
- }
-
- if (input.getTimestamps && !output.timestamps.has_value()) {
- mGraphicBufferProducer->cancelBuffers(cancelBufferInputs, &cancelBufferOutputs);
- ALOGE("%s: no frame timestamp returns!", __FUNCTION__);
- return FAILED_TRANSACTION;
- }
-
- // this should never happen
- ALOGE_IF(output.fence == nullptr,
- "%s: received null Fence! slot=%d", __FUNCTION__, output.slot);
- }
-
- Mutex::Autolock lock(mMutex);
-
- // Write this while holding the mutex
- mLastDequeueStartTime = startTime;
-
- std::vector<int32_t> requestBufferSlots;
- requestBufferSlots.reserve(numBufferRequested);
- // handle release all buffers and request buffers
- for (const auto& output : dequeueOutput) {
- if (output.result & IGraphicBufferProducer::RELEASE_ALL_BUFFERS) {
- ALOGV("%s: RELEASE_ALL_BUFFERS during batch operation", __FUNCTION__);
- freeAllBuffers();
- break;
- }
- }
-
- for (const auto& output : dequeueOutput) {
- // Collect slots that needs requesting buffer
- sp<GraphicBuffer>& gbuf(mSlots[output.slot].buffer);
- if ((result & IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION) || gbuf == nullptr) {
- if (mReportRemovedBuffers && (gbuf != nullptr)) {
- mRemovedBuffers.push_back(gbuf);
- }
- requestBufferSlots.push_back(output.slot);
- }
- }
-
- // Batch request Buffer
- std::vector<RequestBufferOutput> reqBufferOutput;
- if (requestBufferSlots.size() > 0) {
- result = mGraphicBufferProducer->requestBuffers(requestBufferSlots, &reqBufferOutput);
- if (result != NO_ERROR) {
- ALOGE("%s: IGraphicBufferProducer::requestBuffers failed: %d",
- __FUNCTION__, result);
- mGraphicBufferProducer->cancelBuffers(cancelBufferInputs, &cancelBufferOutputs);
- return result;
- }
-
- // Check if we have any single failure
- for (size_t i = 0; i < requestBufferSlots.size(); i++) {
- if (reqBufferOutput[i].result != OK) {
- ALOGE("%s: IGraphicBufferProducer::requestBuffers failed at %zu-th buffer, slot %d",
- __FUNCTION__, i, requestBufferSlots[i]);
- mGraphicBufferProducer->cancelBuffers(cancelBufferInputs, &cancelBufferOutputs);
- return reqBufferOutput[i].result;
- }
- }
-
- // Fill request buffer results to mSlots
- for (size_t i = 0; i < requestBufferSlots.size(); i++) {
- mSlots[requestBufferSlots[i]].buffer = reqBufferOutput[i].buffer;
- }
- }
-
- for (size_t batchIdx = 0; batchIdx < numBufferRequested; batchIdx++) {
- const auto& output = dequeueOutput[batchIdx];
- int slot = output.slot;
- sp<GraphicBuffer>& gbuf(mSlots[slot].buffer);
-
- if (CC_UNLIKELY(atrace_is_tag_enabled(ATRACE_TAG_GRAPHICS))) {
- static FenceMonitor hwcReleaseThread("HWC release");
- hwcReleaseThread.queueFence(output.fence);
- }
-
- if (input.getTimestamps) {
- mFrameEventHistory->applyDelta(output.timestamps.value());
- }
-
- if (output.fence->isValid()) {
- buffers->at(batchIdx).fenceFd = output.fence->dup();
- if (buffers->at(batchIdx).fenceFd == -1) {
- ALOGE("%s: error duping fence: %d", __FUNCTION__, errno);
- // dup() should never fail; something is badly wrong. Soldier on
- // and hope for the best; the worst that should happen is some
- // visible corruption that lasts until the next frame.
- }
- } else {
- buffers->at(batchIdx).fenceFd = -1;
- }
-
- buffers->at(batchIdx).buffer = gbuf.get();
- mDequeuedSlots.insert(slot);
- }
return OK;
}
@@ -934,70 +760,18 @@ int Surface::cancelBuffer(android_native_buffer_t* buffer,
mSharedBufferHasBeenQueued = true;
}
- mDequeuedSlots.erase(i);
-
- return OK;
-}
-
-int Surface::cancelBuffers(const std::vector<BatchBuffer>& buffers) {
- using CancelBufferInput = IGraphicBufferProducer::CancelBufferInput;
- ATRACE_CALL();
- ALOGV("Surface::cancelBuffers");
-
- if (mSharedBufferMode) {
- ALOGE("%s: batch operation is not supported in shared buffer mode!",
- __FUNCTION__);
- return INVALID_OPERATION;
- }
-
- size_t numBuffers = buffers.size();
- std::vector<CancelBufferInput> cancelBufferInputs(numBuffers);
- std::vector<status_t> cancelBufferOutputs;
- size_t numBuffersCancelled = 0;
- int badSlotResult = 0;
- for (size_t i = 0; i < numBuffers; i++) {
- int slot = getSlotFromBufferLocked(buffers[i].buffer);
- int fenceFd = buffers[i].fenceFd;
- if (slot < 0) {
- if (fenceFd >= 0) {
- close(fenceFd);
- }
- ALOGE("%s: cannot find slot number for cancelled buffer", __FUNCTION__);
- badSlotResult = slot;
- } else {
- sp<Fence> fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE);
- cancelBufferInputs[numBuffersCancelled].slot = slot;
- cancelBufferInputs[numBuffersCancelled++].fence = fence;
- }
- }
- cancelBufferInputs.resize(numBuffersCancelled);
- mGraphicBufferProducer->cancelBuffers(cancelBufferInputs, &cancelBufferOutputs);
-
-
- for (size_t i = 0; i < numBuffersCancelled; i++) {
- mDequeuedSlots.erase(cancelBufferInputs[i].slot);
- }
-
- if (badSlotResult != 0) {
- return badSlotResult;
- }
return OK;
}
int Surface::getSlotFromBufferLocked(
android_native_buffer_t* buffer) const {
- if (buffer == nullptr) {
- ALOGE("%s: input buffer is null!", __FUNCTION__);
- return BAD_VALUE;
- }
-
for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
if (mSlots[i].buffer != nullptr &&
mSlots[i].buffer->handle == buffer->handle) {
return i;
}
}
- ALOGE("%s: unknown buffer: %p", __FUNCTION__, buffer->handle);
+ ALOGE("getSlotFromBufferLocked: unknown buffer: %p", buffer->handle);
return BAD_VALUE;
}
@@ -1007,22 +781,42 @@ int Surface::lockBuffer_DEPRECATED(android_native_buffer_t* buffer __attribute__
return OK;
}
-void Surface::getQueueBufferInputLocked(android_native_buffer_t* buffer, int fenceFd,
- nsecs_t timestamp, IGraphicBufferProducer::QueueBufferInput* out) {
+int Surface::queueBuffer(android_native_buffer_t* buffer, int fenceFd) {
+ ATRACE_CALL();
+ ALOGV("Surface::queueBuffer");
+ Mutex::Autolock lock(mMutex);
+ int64_t timestamp;
bool isAutoTimestamp = false;
- if (timestamp == NATIVE_WINDOW_TIMESTAMP_AUTO) {
+ if (mTimestamp == NATIVE_WINDOW_TIMESTAMP_AUTO) {
timestamp = systemTime(SYSTEM_TIME_MONOTONIC);
isAutoTimestamp = true;
ALOGV("Surface::queueBuffer making up timestamp: %.2f ms",
timestamp / 1000000.0);
+ } else {
+ timestamp = mTimestamp;
+ }
+ int i = getSlotFromBufferLocked(buffer);
+ if (i < 0) {
+ if (fenceFd >= 0) {
+ close(fenceFd);
+ }
+ return i;
+ }
+ if (mSharedBufferSlot == i && mSharedBufferHasBeenQueued) {
+ if (fenceFd >= 0) {
+ close(fenceFd);
+ }
+ return OK;
}
+
// Make sure the crop rectangle is entirely inside the buffer.
Rect crop(Rect::EMPTY_RECT);
mCrop.intersect(Rect(buffer->width, buffer->height), &crop);
sp<Fence> fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE);
+ IGraphicBufferProducer::QueueBufferOutput output;
IGraphicBufferProducer::QueueBufferInput input(timestamp, isAutoTimestamp,
static_cast<android_dataspace>(mDataSpace), crop, mScalingMode,
mTransform ^ mStickyTransform, fence, mStickyTransform,
@@ -1093,12 +887,13 @@ void Surface::getQueueBufferInputLocked(android_native_buffer_t* buffer, int fen
input.setSurfaceDamage(flippedRegion);
}
- *out = input;
-}
-void Surface::onBufferQueuedLocked(int slot, sp<Fence> fence,
- const IGraphicBufferProducer::QueueBufferOutput& output) {
- mDequeuedSlots.erase(slot);
+ nsecs_t now = systemTime();
+ status_t err = mGraphicBufferProducer->queueBuffer(i, input, &output);
+ mLastQueueDuration = systemTime() - now;
+ if (err != OK) {
+ ALOGE("queueBuffer: error queuing buffer to SurfaceTexture, %d", err);
+ }
if (mEnableFrameTimestamps) {
mFrameEventHistory->applyDelta(output.frameTimestamps);
@@ -1132,7 +927,7 @@ void Surface::onBufferQueuedLocked(int slot, sp<Fence> fence,
mDirtyRegion = Region::INVALID_REGION;
}
- if (mSharedBufferMode && mAutoRefresh && mSharedBufferSlot == slot) {
+ if (mSharedBufferMode && mAutoRefresh && mSharedBufferSlot == i) {
mSharedBufferHasBeenQueued = true;
}
@@ -1142,89 +937,6 @@ void Surface::onBufferQueuedLocked(int slot, sp<Fence> fence,
static FenceMonitor gpuCompletionThread("GPU completion");
gpuCompletionThread.queueFence(fence);
}
-}
-
-int Surface::queueBuffer(android_native_buffer_t* buffer, int fenceFd) {
- ATRACE_CALL();
- ALOGV("Surface::queueBuffer");
- Mutex::Autolock lock(mMutex);
-
- int i = getSlotFromBufferLocked(buffer);
- if (i < 0) {
- if (fenceFd >= 0) {
- close(fenceFd);
- }
- return i;
- }
- if (mSharedBufferSlot == i && mSharedBufferHasBeenQueued) {
- if (fenceFd >= 0) {
- close(fenceFd);
- }
- return OK;
- }
-
- IGraphicBufferProducer::QueueBufferOutput output;
- IGraphicBufferProducer::QueueBufferInput input;
- getQueueBufferInputLocked(buffer, fenceFd, mTimestamp, &input);
- sp<Fence> fence = input.fence;
-
- nsecs_t now = systemTime();
- status_t err = mGraphicBufferProducer->queueBuffer(i, input, &output);
- mLastQueueDuration = systemTime() - now;
- if (err != OK) {
- ALOGE("queueBuffer: error queuing buffer, %d", err);
- }
-
- onBufferQueuedLocked(i, fence, output);
- return err;
-}
-
-int Surface::queueBuffers(const std::vector<BatchQueuedBuffer>& buffers) {
- ATRACE_CALL();
- ALOGV("Surface::queueBuffers");
- Mutex::Autolock lock(mMutex);
-
- if (mSharedBufferMode) {
- ALOGE("%s: batched operation is not supported in shared buffer mode", __FUNCTION__);
- return INVALID_OPERATION;
- }
-
- size_t numBuffers = buffers.size();
- std::vector<IGraphicBufferProducer::QueueBufferInput> queueBufferInputs(numBuffers);
- std::vector<IGraphicBufferProducer::QueueBufferOutput> queueBufferOutputs;
- std::vector<int> bufferSlots(numBuffers, -1);
- std::vector<sp<Fence>> bufferFences(numBuffers);
-
- for (size_t batchIdx = 0; batchIdx < numBuffers; batchIdx++) {
- int i = getSlotFromBufferLocked(buffers[batchIdx].buffer);
- if (i < 0) {
- if (buffers[batchIdx].fenceFd >= 0) {
- close(buffers[batchIdx].fenceFd);
- }
- return i;
- }
- bufferSlots[batchIdx] = i;
-
- IGraphicBufferProducer::QueueBufferInput input;
- getQueueBufferInputLocked(
- buffers[batchIdx].buffer, buffers[batchIdx].fenceFd, buffers[batchIdx].timestamp,
- &input);
- bufferFences[batchIdx] = input.fence;
- queueBufferInputs[batchIdx] = input;
- }
-
- nsecs_t now = systemTime();
- status_t err = mGraphicBufferProducer->queueBuffers(queueBufferInputs, &queueBufferOutputs);
- mLastQueueDuration = systemTime() - now;
- if (err != OK) {
- ALOGE("%s: error queuing buffer, %d", __FUNCTION__, err);
- }
-
-
- for (size_t batchIdx = 0; batchIdx < numBuffers; batchIdx++) {
- onBufferQueuedLocked(bufferSlots[batchIdx], bufferFences[batchIdx],
- queueBufferOutputs[batchIdx]);
- }
return err;
}
@@ -1265,15 +977,8 @@ int Surface::query(int what, int* value) const {
}
break;
case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER: {
- status_t err = mGraphicBufferProducer->query(what, value);
- if (err == NO_ERROR) {
- return NO_ERROR;
- }
- sp<ISurfaceComposer> surfaceComposer = composerService();
- if (surfaceComposer == nullptr) {
- return -EPERM; // likely permissions error
- }
- if (surfaceComposer->authenticateSurfaceTexture(mGraphicBufferProducer)) {
+ if (composerService()->authenticateSurfaceTexture(
+ mGraphicBufferProducer)) {
*value = 1;
} else {
*value = 0;
@@ -1292,7 +997,7 @@ int Surface::query(int what, int* value) const {
mUserHeight ? mUserHeight : mDefaultHeight);
return NO_ERROR;
case NATIVE_WINDOW_TRANSFORM_HINT:
- *value = static_cast<int>(getTransformHint());
+ *value = static_cast<int>(mTransformHint);
return NO_ERROR;
case NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND: {
status_t err = NO_ERROR;
@@ -1496,12 +1201,6 @@ int Surface::perform(int operation, va_list args)
case NATIVE_WINDOW_GET_LAST_QUEUED_BUFFER:
res = dispatchGetLastQueuedBuffer(args);
break;
- case NATIVE_WINDOW_GET_LAST_QUEUED_BUFFER2:
- res = dispatchGetLastQueuedBuffer2(args);
- break;
- case NATIVE_WINDOW_SET_FRAME_TIMELINE_INFO:
- res = dispatchSetFrameTimelineInfo(args);
- break;
default:
res = NAME_NOT_FOUND;
break;
@@ -1733,8 +1432,7 @@ int Surface::dispatchGetLastQueueDuration(va_list args) {
int Surface::dispatchSetFrameRate(va_list args) {
float frameRate = static_cast<float>(va_arg(args, double));
int8_t compatibility = static_cast<int8_t>(va_arg(args, int));
- int8_t changeFrameRateStrategy = static_cast<int8_t>(va_arg(args, int));
- return setFrameRate(frameRate, compatibility, changeFrameRateStrategy);
+ return setFrameRate(frameRate, compatibility);
}
int Surface::dispatchAddCancelInterceptor(va_list args) {
@@ -1795,7 +1493,7 @@ int Surface::dispatchGetLastQueuedBuffer(va_list args) {
int result = mGraphicBufferProducer->getLastQueuedBuffer(&graphicBuffer, &spFence, matrix);
if (graphicBuffer != nullptr) {
- *buffer = graphicBuffer->toAHardwareBuffer();
+ *buffer = reinterpret_cast<AHardwareBuffer*>(graphicBuffer.get());
AHardwareBuffer_acquire(*buffer);
} else {
*buffer = nullptr;
@@ -1809,55 +1507,13 @@ int Surface::dispatchGetLastQueuedBuffer(va_list args) {
return result;
}
-int Surface::dispatchGetLastQueuedBuffer2(va_list args) {
- AHardwareBuffer** buffer = va_arg(args, AHardwareBuffer**);
- int* fence = va_arg(args, int*);
- ARect* crop = va_arg(args, ARect*);
- uint32_t* transform = va_arg(args, uint32_t*);
- sp<GraphicBuffer> graphicBuffer;
- sp<Fence> spFence;
-
- Rect r;
- int result =
- mGraphicBufferProducer->getLastQueuedBuffer(&graphicBuffer, &spFence, &r, transform);
-
- if (graphicBuffer != nullptr) {
- *buffer = graphicBuffer->toAHardwareBuffer();
- AHardwareBuffer_acquire(*buffer);
-
- // Avoid setting crop* unless buffer is valid (matches IGBP behavior)
- crop->left = r.left;
- crop->top = r.top;
- crop->right = r.right;
- crop->bottom = r.bottom;
- } else {
- *buffer = nullptr;
- }
-
- if (spFence != nullptr) {
- *fence = spFence->dup();
- } else {
- *fence = -1;
- }
- return result;
-}
-
-int Surface::dispatchSetFrameTimelineInfo(va_list args) {
- ATRACE_CALL();
- auto frameTimelineVsyncId = static_cast<int64_t>(va_arg(args, int64_t));
- auto inputEventId = static_cast<int32_t>(va_arg(args, int32_t));
-
- ALOGV("Surface::%s", __func__);
- return setFrameTimelineInfo({frameTimelineVsyncId, inputEventId});
-}
-
-bool Surface::transformToDisplayInverse() const {
+bool Surface::transformToDisplayInverse() {
return (mTransform & NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY) ==
NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
}
int Surface::connect(int api) {
- static sp<IProducerListener> listener = new StubProducerListener();
+ static sp<IProducerListener> listener = new DummyProducerListener();
return connect(api, listener);
}
@@ -2004,7 +1660,6 @@ int Surface::attachBuffer(ANativeWindowBuffer* buffer)
mRemovedBuffers.push_back(mSlots[attachedSlot].buffer);
}
mSlots[attachedSlot].buffer = graphicBuffer;
- mDequeuedSlots.insert(attachedSlot);
return NO_ERROR;
}
@@ -2271,10 +1926,6 @@ Dataspace Surface::getBuffersDataSpace() {
}
void Surface::freeAllBuffers() {
- if (!mDequeuedSlots.empty()) {
- ALOGE("%s: %zu buffers were freed while being dequeued!",
- __FUNCTION__, mDequeuedSlots.size());
- }
for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
mSlots[i].buffer = nullptr;
}
@@ -2296,10 +1947,6 @@ status_t Surface::getAndFlushBuffersFromSlots(const std::vector<int32_t>& slots,
ALOGW("%s: Discarded slot %d doesn't contain buffer!", __FUNCTION__, i);
continue;
}
- // Don't flush currently dequeued buffers
- if (mDequeuedSlots.count(i) > 0) {
- continue;
- }
outBuffers->push_back(mSlots[i].buffer);
mSlots[i].buffer = nullptr;
}
@@ -2604,32 +2251,15 @@ void Surface::ProducerListenerProxy::onBuffersDiscarded(const std::vector<int32_
mSurfaceListener->onBuffersDiscarded(discardedBufs);
}
-status_t Surface::setFrameRate(float frameRate, int8_t compatibility,
- int8_t changeFrameRateStrategy) {
+status_t Surface::setFrameRate(float frameRate, int8_t compatibility) {
ATRACE_CALL();
ALOGV("Surface::setFrameRate");
- if (!ValidateFrameRate(frameRate, compatibility, changeFrameRateStrategy,
- "Surface::setFrameRate")) {
+ if (!ValidateFrameRate(frameRate, compatibility, "Surface::setFrameRate")) {
return BAD_VALUE;
}
- return composerService()->setFrameRate(mGraphicBufferProducer, frameRate, compatibility,
- changeFrameRateStrategy);
-}
-
-status_t Surface::setFrameTimelineInfo(const FrameTimelineInfo& frameTimelineInfo) {
- return composerService()->setFrameTimelineInfo(mGraphicBufferProducer, frameTimelineInfo);
-}
-
-sp<IBinder> Surface::getSurfaceControlHandle() const {
- Mutex::Autolock lock(mMutex);
- return mSurfaceControlHandle;
-}
-
-void Surface::destroy() {
- Mutex::Autolock lock(mMutex);
- mSurfaceControlHandle = nullptr;
+ return composerService()->setFrameRate(mGraphicBufferProducer, frameRate, compatibility);
}
}; // namespace android