Effect: Clarify ExternalTextureManager thread access.
Turns out more things are accessed only on the GL thread than labelled. PiperOrigin-RevId: 579244695
This commit is contained in:
parent
bce82bdc75
commit
920d588575
@ -70,25 +70,25 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
private final Queue<FrameInfo> pendingFrames;
|
private final Queue<FrameInfo> pendingFrames;
|
||||||
private final ScheduledExecutorService forceEndOfStreamExecutorService;
|
private final ScheduledExecutorService forceEndOfStreamExecutorService;
|
||||||
|
|
||||||
// Incremented on any thread, decremented on the GL thread only.
|
// Created on any thread. Otherwise, read and written on the GL thread only.
|
||||||
private final AtomicInteger externalShaderProgramInputCapacity;
|
private final AtomicInteger externalShaderProgramInputCapacity;
|
||||||
// Counts the frames that are registered before flush but are made available after flush.
|
// Counts the frames that are registered before flush but are made available after flush.
|
||||||
// Read and written only on GL thread.
|
// Read and written on the GL thread only.
|
||||||
private int numberOfFramesToDropOnBecomingAvailable;
|
private int numberOfFramesToDropOnBecomingAvailable;
|
||||||
|
|
||||||
// Read and written only on GL thread.
|
// Read and written on the GL thread only.
|
||||||
private int availableFrameCount;
|
private int availableFrameCount;
|
||||||
|
|
||||||
// Read and written on the GL thread only.
|
// Read and written on the GL thread only.
|
||||||
private boolean currentInputStreamEnded;
|
private boolean currentInputStreamEnded;
|
||||||
|
|
||||||
// The frame that is sent downstream and is not done processing yet.
|
// The frame that is sent downstream and is not done processing yet.
|
||||||
// Set to null on any thread. Read and set to non-null on the GL thread only.
|
// Read and written on the GL thread only.
|
||||||
@Nullable private volatile FrameInfo currentFrame;
|
@Nullable private FrameInfo currentFrame;
|
||||||
|
|
||||||
@Nullable private Future<?> forceSignalEndOfStreamFuture;
|
@Nullable private Future<?> forceSignalEndOfStreamFuture;
|
||||||
|
|
||||||
// Whether to reject frames from the SurfaceTexture. Accessed only on GL thread.
|
// Whether to reject frames from the SurfaceTexture. Accessed on the GL thread only.
|
||||||
private boolean shouldRejectIncomingFrames;
|
private boolean shouldRejectIncomingFrames;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -231,6 +231,19 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
forceEndOfStreamExecutorService.shutdownNow();
|
forceEndOfStreamExecutorService.shutdownNow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Methods that must be called on the GL thread.
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void flush() {
|
||||||
|
// A frame that is registered before flush may arrive after flush.
|
||||||
|
numberOfFramesToDropOnBecomingAvailable = pendingFrames.size() - availableFrameCount;
|
||||||
|
removeAllSurfaceTextureFrames();
|
||||||
|
externalShaderProgramInputCapacity.set(0);
|
||||||
|
currentFrame = null;
|
||||||
|
pendingFrames.clear();
|
||||||
|
maybeExecuteAfterFlushTask();
|
||||||
|
}
|
||||||
|
|
||||||
private void maybeExecuteAfterFlushTask() {
|
private void maybeExecuteAfterFlushTask() {
|
||||||
if (numberOfFramesToDropOnBecomingAvailable > 0) {
|
if (numberOfFramesToDropOnBecomingAvailable > 0) {
|
||||||
return;
|
return;
|
||||||
@ -238,8 +251,6 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
super.flush();
|
super.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Methods that must be called on the GL thread.
|
|
||||||
|
|
||||||
private void restartForceSignalEndOfStreamTimer() {
|
private void restartForceSignalEndOfStreamTimer() {
|
||||||
cancelForceSignalEndOfStreamTimer();
|
cancelForceSignalEndOfStreamTimer();
|
||||||
forceSignalEndOfStreamFuture =
|
forceSignalEndOfStreamFuture =
|
||||||
@ -277,17 +288,6 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
signalEndOfCurrentInputStream();
|
signalEndOfCurrentInputStream();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void flush() {
|
|
||||||
// A frame that is registered before flush may arrive after flush.
|
|
||||||
numberOfFramesToDropOnBecomingAvailable = pendingFrames.size() - availableFrameCount;
|
|
||||||
removeAllSurfaceTextureFrames();
|
|
||||||
externalShaderProgramInputCapacity.set(0);
|
|
||||||
currentFrame = null;
|
|
||||||
pendingFrames.clear();
|
|
||||||
maybeExecuteAfterFlushTask();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void removeAllSurfaceTextureFrames() {
|
private void removeAllSurfaceTextureFrames() {
|
||||||
while (availableFrameCount > 0) {
|
while (availableFrameCount > 0) {
|
||||||
availableFrameCount--;
|
availableFrameCount--;
|
||||||
@ -312,7 +312,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
externalShaderProgram.setTextureTransformMatrix(textureTransformMatrix);
|
externalShaderProgram.setTextureTransformMatrix(textureTransformMatrix);
|
||||||
long frameTimeNs = surfaceTexture.getTimestamp();
|
long frameTimeNs = surfaceTexture.getTimestamp();
|
||||||
long offsetToAddUs = currentFrame.offsetToAddUs;
|
long offsetToAddUs = currentFrame.offsetToAddUs;
|
||||||
// Correct the presentation time so that GlShaderPrograms don't see the stream offset.
|
// Correct presentationTimeUs so that GlShaderPrograms don't see the stream offset.
|
||||||
long presentationTimeUs = (frameTimeNs / 1000) + offsetToAddUs;
|
long presentationTimeUs = (frameTimeNs / 1000) + offsetToAddUs;
|
||||||
externalShaderProgram.queueInputFrame(
|
externalShaderProgram.queueInputFrame(
|
||||||
glObjectsProvider,
|
glObjectsProvider,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user