Merge "Plumb gralloc producer/consumer bits correctly" into oc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
b9a2e32130
@@ -14754,18 +14754,16 @@ package android.hardware {
|
||||
field public static final int RGBX_8888 = 2; // 0x2
|
||||
field public static final int RGB_565 = 4; // 0x4
|
||||
field public static final int RGB_888 = 3; // 0x3
|
||||
field public static final long USAGE0_CPU_READ = 2L; // 0x2L
|
||||
field public static final long USAGE0_CPU_READ_OFTEN = 6L; // 0x6L
|
||||
field public static final long USAGE0_CPU_WRITE = 32L; // 0x20L
|
||||
field public static final long USAGE0_CPU_WRITE_OFTEN = 96L; // 0x60L
|
||||
field public static final long USAGE0_GPU_COLOR_OUTPUT = 2048L; // 0x800L
|
||||
field public static final long USAGE0_GPU_CUBEMAP = 8192L; // 0x2000L
|
||||
field public static final long USAGE0_GPU_DATA_BUFFER = 16384L; // 0x4000L
|
||||
field public static final long USAGE0_GPU_SAMPLED_IMAGE = 1024L; // 0x400L
|
||||
field public static final long USAGE0_GPU_STORAGE_IMAGE = 3072L; // 0xc00L
|
||||
field public static final long USAGE0_PROTECTED_CONTENT = 262144L; // 0x40000L
|
||||
field public static final long USAGE0_SENSOR_DIRECT_DATA = 536870912L; // 0x20000000L
|
||||
field public static final long USAGE0_VIDEO_ENCODE = 2097152L; // 0x200000L
|
||||
field public static final long USAGE_CPU_READ_OFTEN = 3L; // 0x3L
|
||||
field public static final long USAGE_CPU_READ_RARELY = 2L; // 0x2L
|
||||
field public static final long USAGE_CPU_WRITE_OFTEN = 48L; // 0x30L
|
||||
field public static final long USAGE_CPU_WRITE_RARELY = 32L; // 0x20L
|
||||
field public static final long USAGE_GPU_COLOR_OUTPUT = 512L; // 0x200L
|
||||
field public static final long USAGE_GPU_DATA_BUFFER = 16777216L; // 0x1000000L
|
||||
field public static final long USAGE_GPU_SAMPLED_IMAGE = 256L; // 0x100L
|
||||
field public static final long USAGE_PROTECTED_CONTENT = 16384L; // 0x4000L
|
||||
field public static final long USAGE_SENSOR_DIRECT_DATA = 8388608L; // 0x800000L
|
||||
field public static final long USAGE_VIDEO_ENCODE = 65536L; // 0x10000L
|
||||
}
|
||||
|
||||
public final class Sensor {
|
||||
|
||||
@@ -15532,18 +15532,16 @@ package android.hardware {
|
||||
field public static final int RGBX_8888 = 2; // 0x2
|
||||
field public static final int RGB_565 = 4; // 0x4
|
||||
field public static final int RGB_888 = 3; // 0x3
|
||||
field public static final long USAGE0_CPU_READ = 2L; // 0x2L
|
||||
field public static final long USAGE0_CPU_READ_OFTEN = 6L; // 0x6L
|
||||
field public static final long USAGE0_CPU_WRITE = 32L; // 0x20L
|
||||
field public static final long USAGE0_CPU_WRITE_OFTEN = 96L; // 0x60L
|
||||
field public static final long USAGE0_GPU_COLOR_OUTPUT = 2048L; // 0x800L
|
||||
field public static final long USAGE0_GPU_CUBEMAP = 8192L; // 0x2000L
|
||||
field public static final long USAGE0_GPU_DATA_BUFFER = 16384L; // 0x4000L
|
||||
field public static final long USAGE0_GPU_SAMPLED_IMAGE = 1024L; // 0x400L
|
||||
field public static final long USAGE0_GPU_STORAGE_IMAGE = 3072L; // 0xc00L
|
||||
field public static final long USAGE0_PROTECTED_CONTENT = 262144L; // 0x40000L
|
||||
field public static final long USAGE0_SENSOR_DIRECT_DATA = 536870912L; // 0x20000000L
|
||||
field public static final long USAGE0_VIDEO_ENCODE = 2097152L; // 0x200000L
|
||||
field public static final long USAGE_CPU_READ_OFTEN = 3L; // 0x3L
|
||||
field public static final long USAGE_CPU_READ_RARELY = 2L; // 0x2L
|
||||
field public static final long USAGE_CPU_WRITE_OFTEN = 48L; // 0x30L
|
||||
field public static final long USAGE_CPU_WRITE_RARELY = 32L; // 0x20L
|
||||
field public static final long USAGE_GPU_COLOR_OUTPUT = 512L; // 0x200L
|
||||
field public static final long USAGE_GPU_DATA_BUFFER = 16777216L; // 0x1000000L
|
||||
field public static final long USAGE_GPU_SAMPLED_IMAGE = 256L; // 0x100L
|
||||
field public static final long USAGE_PROTECTED_CONTENT = 16384L; // 0x4000L
|
||||
field public static final long USAGE_SENSOR_DIRECT_DATA = 8388608L; // 0x800000L
|
||||
field public static final long USAGE_VIDEO_ENCODE = 65536L; // 0x10000L
|
||||
}
|
||||
|
||||
public final class Sensor {
|
||||
|
||||
@@ -14800,18 +14800,16 @@ package android.hardware {
|
||||
field public static final int RGBX_8888 = 2; // 0x2
|
||||
field public static final int RGB_565 = 4; // 0x4
|
||||
field public static final int RGB_888 = 3; // 0x3
|
||||
field public static final long USAGE0_CPU_READ = 2L; // 0x2L
|
||||
field public static final long USAGE0_CPU_READ_OFTEN = 6L; // 0x6L
|
||||
field public static final long USAGE0_CPU_WRITE = 32L; // 0x20L
|
||||
field public static final long USAGE0_CPU_WRITE_OFTEN = 96L; // 0x60L
|
||||
field public static final long USAGE0_GPU_COLOR_OUTPUT = 2048L; // 0x800L
|
||||
field public static final long USAGE0_GPU_CUBEMAP = 8192L; // 0x2000L
|
||||
field public static final long USAGE0_GPU_DATA_BUFFER = 16384L; // 0x4000L
|
||||
field public static final long USAGE0_GPU_SAMPLED_IMAGE = 1024L; // 0x400L
|
||||
field public static final long USAGE0_GPU_STORAGE_IMAGE = 3072L; // 0xc00L
|
||||
field public static final long USAGE0_PROTECTED_CONTENT = 262144L; // 0x40000L
|
||||
field public static final long USAGE0_SENSOR_DIRECT_DATA = 536870912L; // 0x20000000L
|
||||
field public static final long USAGE0_VIDEO_ENCODE = 2097152L; // 0x200000L
|
||||
field public static final long USAGE_CPU_READ_OFTEN = 3L; // 0x3L
|
||||
field public static final long USAGE_CPU_READ_RARELY = 2L; // 0x2L
|
||||
field public static final long USAGE_CPU_WRITE_OFTEN = 48L; // 0x30L
|
||||
field public static final long USAGE_CPU_WRITE_RARELY = 32L; // 0x20L
|
||||
field public static final long USAGE_GPU_COLOR_OUTPUT = 512L; // 0x200L
|
||||
field public static final long USAGE_GPU_DATA_BUFFER = 16777216L; // 0x1000000L
|
||||
field public static final long USAGE_GPU_SAMPLED_IMAGE = 256L; // 0x100L
|
||||
field public static final long USAGE_PROTECTED_CONTENT = 16384L; // 0x4000L
|
||||
field public static final long USAGE_SENSOR_DIRECT_DATA = 8388608L; // 0x800000L
|
||||
field public static final long USAGE_VIDEO_ENCODE = 65536L; // 0x10000L
|
||||
}
|
||||
|
||||
public final class Sensor {
|
||||
|
||||
@@ -70,37 +70,34 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable {
|
||||
|
||||
/** @hide */
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef(flag = true, value = {USAGE0_CPU_READ, USAGE0_CPU_READ_OFTEN, USAGE0_CPU_WRITE,
|
||||
USAGE0_CPU_WRITE_OFTEN, USAGE0_GPU_SAMPLED_IMAGE, USAGE0_GPU_COLOR_OUTPUT,
|
||||
USAGE0_GPU_STORAGE_IMAGE, USAGE0_GPU_CUBEMAP, USAGE0_GPU_DATA_BUFFER,
|
||||
USAGE0_PROTECTED_CONTENT, USAGE0_SENSOR_DIRECT_DATA, USAGE0_VIDEO_ENCODE})
|
||||
public @interface Usage0 {};
|
||||
@IntDef(flag = true, value = {USAGE_CPU_READ_RARELY, USAGE_CPU_READ_OFTEN,
|
||||
USAGE_CPU_WRITE_RARELY, USAGE_CPU_WRITE_OFTEN, USAGE_GPU_SAMPLED_IMAGE,
|
||||
USAGE_GPU_COLOR_OUTPUT, USAGE_PROTECTED_CONTENT, USAGE_VIDEO_ENCODE,
|
||||
USAGE_GPU_DATA_BUFFER, USAGE_SENSOR_DIRECT_DATA})
|
||||
public @interface Usage {};
|
||||
|
||||
/** Usage0: the buffer will sometimes be read by the CPU */
|
||||
public static final long USAGE0_CPU_READ = (1 << 1);
|
||||
/** Usage0: the buffer will often be read by the CPU*/
|
||||
public static final long USAGE0_CPU_READ_OFTEN = (1 << 2 | USAGE0_CPU_READ);
|
||||
/** Usage0: the buffer will sometimes be written to by the CPU */
|
||||
public static final long USAGE0_CPU_WRITE = (1 << 5);
|
||||
/** Usage0: the buffer will often be written to by the CPU */
|
||||
public static final long USAGE0_CPU_WRITE_OFTEN = (1 << 6 | USAGE0_CPU_WRITE);
|
||||
/** Usage0: the buffer will be read from by the GPU */
|
||||
public static final long USAGE0_GPU_SAMPLED_IMAGE = (1 << 10);
|
||||
/** Usage0: the buffer will be written to by the GPU */
|
||||
public static final long USAGE0_GPU_COLOR_OUTPUT = (1 << 11);
|
||||
/** Usage0: the buffer will be read from and written to by the GPU */
|
||||
public static final long USAGE0_GPU_STORAGE_IMAGE = (USAGE0_GPU_SAMPLED_IMAGE |
|
||||
USAGE0_GPU_COLOR_OUTPUT);
|
||||
/** Usage0: the buffer will be used as a cubemap texture */
|
||||
public static final long USAGE0_GPU_CUBEMAP = (1 << 13);
|
||||
/** Usage0: the buffer will be used as a shader storage or uniform buffer object*/
|
||||
public static final long USAGE0_GPU_DATA_BUFFER = (1 << 14);
|
||||
/** Usage0: the buffer must not be used outside of a protected hardware path */
|
||||
public static final long USAGE0_PROTECTED_CONTENT = (1 << 18);
|
||||
/** Usage0: the buffer will be used for sensor direct data */
|
||||
public static final long USAGE0_SENSOR_DIRECT_DATA = (1 << 29);
|
||||
/** Usage0: the buffer will be read by a hardware video encoder */
|
||||
public static final long USAGE0_VIDEO_ENCODE = (1 << 21);
|
||||
/** Usage: The buffer will sometimes be read by the CPU */
|
||||
public static final long USAGE_CPU_READ_RARELY = 2;
|
||||
/** Usage: The buffer will often be read by the CPU */
|
||||
public static final long USAGE_CPU_READ_OFTEN = 3;
|
||||
|
||||
/** Usage: The buffer will sometimes be written to by the CPU */
|
||||
public static final long USAGE_CPU_WRITE_RARELY = 2 << 4;
|
||||
/** Usage: The buffer will often be written to by the CPU */
|
||||
public static final long USAGE_CPU_WRITE_OFTEN = 3 << 4;
|
||||
|
||||
/** Usage: The buffer will be read from by the GPU */
|
||||
public static final long USAGE_GPU_SAMPLED_IMAGE = 1 << 8;
|
||||
/** Usage: The buffer will be written to by the GPU */
|
||||
public static final long USAGE_GPU_COLOR_OUTPUT = 1 << 9;
|
||||
/** Usage: The buffer must not be used outside of a protected hardware path */
|
||||
public static final long USAGE_PROTECTED_CONTENT = 1 << 14;
|
||||
/** Usage: The buffer will be read by a hardware video encoder */
|
||||
public static final long USAGE_VIDEO_ENCODE = 1 << 16;
|
||||
/** Usage: The buffer will be used for sensor direct data */
|
||||
public static final long USAGE_SENSOR_DIRECT_DATA = 1 << 23;
|
||||
/** Usage: The buffer will be used as a shader storage or uniform buffer object */
|
||||
public static final long USAGE_GPU_DATA_BUFFER = 1 << 24;
|
||||
|
||||
// The approximate size of a native AHardwareBuffer object.
|
||||
private static final long NATIVE_HARDWARE_BUFFER_SIZE = 232;
|
||||
@@ -116,13 +113,11 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable {
|
||||
* {@link #RGBX_8888}, {@link #RGB_565}, {@link #RGB_888}, {@link #RGBA_1010102}, {@link #BLOB}
|
||||
* @param layers The number of layers in the buffer
|
||||
* @param usage Flags describing how the buffer will be used, one of
|
||||
* {@link #USAGE0_CPU_READ}, {@link #USAGE0_CPU_READ_OFTEN}, {@link #USAGE0_CPU_WRITE},
|
||||
* {@link #USAGE0_CPU_WRITE_OFTEN}, {@link #USAGE0_GPU_SAMPLED_IMAGE},
|
||||
* {@link #USAGE0_GPU_COLOR_OUTPUT},{@link #USAGE0_GPU_STORAGE_IMAGE},
|
||||
* {@link #USAGE0_GPU_CUBEMAP}, {@link #USAGE0_GPU_DATA_BUFFER},
|
||||
* {@link #USAGE0_PROTECTED_CONTENT}, {@link #USAGE0_SENSOR_DIRECT_DATA},
|
||||
* {@link #USAGE0_VIDEO_ENCODE}
|
||||
*
|
||||
* {@link #USAGE_CPU_READ_RARELY}, {@link #USAGE_CPU_READ_OFTEN},
|
||||
* {@link #USAGE_CPU_WRITE_RARELY}, {@link #USAGE_CPU_WRITE_OFTEN},
|
||||
* {@link #USAGE_GPU_SAMPLED_IMAGE}, {@link #USAGE_GPU_COLOR_OUTPUT},
|
||||
* {@link #USAGE_GPU_DATA_BUFFER}, {@link #USAGE_PROTECTED_CONTENT},
|
||||
* {@link #USAGE_SENSOR_DIRECT_DATA}, {@link #USAGE_VIDEO_ENCODE}
|
||||
* @return A <code>HardwareBuffer</code> instance if successful, or throws an
|
||||
* IllegalArgumentException if the dimensions passed are invalid (either zero, negative, or
|
||||
* too large to allocate), if the format is not supported, if the requested number of layers
|
||||
@@ -130,7 +125,7 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable {
|
||||
*/
|
||||
@NonNull
|
||||
public static HardwareBuffer create(int width, int height, @Format int format, int layers,
|
||||
@Usage0 long usage) {
|
||||
@Usage long usage) {
|
||||
if (!HardwareBuffer.isSupportedFormat(format)) {
|
||||
throw new IllegalArgumentException("Invalid pixel format " + format);
|
||||
}
|
||||
|
||||
@@ -589,9 +589,9 @@ public class SystemSensorManager extends SensorManager {
|
||||
"Width if HaradwareBuffer must be greater than "
|
||||
+ MIN_DIRECT_CHANNEL_BUFFER_SIZE);
|
||||
}
|
||||
if ((hardwareBuffer.getUsage() & HardwareBuffer.USAGE0_SENSOR_DIRECT_DATA) == 0) {
|
||||
if ((hardwareBuffer.getUsage() & HardwareBuffer.USAGE_SENSOR_DIRECT_DATA) == 0) {
|
||||
throw new IllegalArgumentException(
|
||||
"HardwareBuffer must set usage flag USAGE0_SENSOR_DIRECT_DATA");
|
||||
"HardwareBuffer must set usage flag USAGE_SENSOR_DIRECT_DATA");
|
||||
}
|
||||
size = hardwareBuffer.getWidth();
|
||||
id = nativeCreateDirectChannel(
|
||||
|
||||
@@ -80,14 +80,10 @@ static jlong android_hardware_HardwareBuffer_create(JNIEnv* env, jobject clazz,
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
uint64_t producerUsage = 0;
|
||||
uint64_t consumerUsage = 0;
|
||||
android_hardware_HardwareBuffer_convertToGrallocUsageBits(
|
||||
&producerUsage, &consumerUsage, usage, 0);
|
||||
|
||||
uint64_t grallocUsage = AHardwareBuffer_convertToGrallocUsageBits(usage);
|
||||
sp<GraphicBuffer> buffer = new GraphicBuffer(width, height, pixelFormat, layers,
|
||||
android_convertGralloc1To0Usage(producerUsage, consumerUsage),
|
||||
std::string("HardwareBuffer pid [") + std::to_string(getpid()) +"]");
|
||||
grallocUsage, std::string("HardwareBuffer pid [") + std::to_string(getpid()) +"]");
|
||||
status_t error = buffer->initCheck();
|
||||
if (error < 0) {
|
||||
if (kDebugGraphicBuffer) {
|
||||
@@ -145,11 +141,7 @@ static jint android_hardware_HardwareBuffer_getLayers(JNIEnv* env,
|
||||
static jlong android_hardware_HardwareBuffer_getUsage(JNIEnv* env,
|
||||
jobject clazz, jlong nativeObject) {
|
||||
GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject);
|
||||
uint64_t usage0 = 0;
|
||||
uint64_t usage1 = 0;
|
||||
android_hardware_HardwareBuffer_convertFromGrallocUsageBits(&usage0, &usage1,
|
||||
buffer->getUsage(), buffer->getUsage());
|
||||
return usage0;
|
||||
return AHardwareBuffer_convertFromGrallocUsageBits(buffer->getUsage());
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -221,14 +213,8 @@ uint32_t android_hardware_HardwareBuffer_convertToPixelFormat(uint32_t format) {
|
||||
return AHardwareBuffer_convertToPixelFormat(format);
|
||||
}
|
||||
|
||||
void android_hardware_HardwareBuffer_convertToGrallocUsageBits(uint64_t* outProducerUsage,
|
||||
uint64_t* outConsumerUsage, uint64_t usage0, uint64_t usage1) {
|
||||
AHardwareBuffer_convertToGrallocUsageBits(outProducerUsage, outConsumerUsage, usage0, usage1);
|
||||
}
|
||||
|
||||
void android_hardware_HardwareBuffer_convertFromGrallocUsageBits(uint64_t* outUsage0,
|
||||
uint64_t* outUsage1, uint64_t producerUsage, uint64_t consumerUsage) {
|
||||
AHardwareBuffer_convertFromGrallocUsageBits(outUsage0, outUsage1, producerUsage, consumerUsage);
|
||||
uint64_t android_hardware_HardwareBuffer_convertToGrallocUsageBits(uint64_t usage) {
|
||||
return AHardwareBuffer_convertToGrallocUsageBits(usage);
|
||||
}
|
||||
|
||||
} // namespace android
|
||||
|
||||
@@ -32,22 +32,19 @@ extern jobject android_hardware_HardwareBuffer_createFromAHardwareBuffer(
|
||||
JNIEnv* env, AHardwareBuffer* hardwareBuffer);
|
||||
|
||||
/* Convert from HAL_PIXEL_FORMAT values to AHARDWAREBUFFER_FORMAT values. */
|
||||
extern uint32_t android_hardware_HardwareBuffer_convertFromPixelFormat(
|
||||
uint32_t format);
|
||||
extern uint32_t android_hardware_HardwareBuffer_convertFromPixelFormat(uint32_t format);
|
||||
|
||||
/* Convert from AHARDWAREBUFFER_FORMAT values to HAL_PIXEL_FORMAT values. */
|
||||
extern uint32_t android_hardware_HardwareBuffer_convertToPixelFormat(
|
||||
uint32_t format);
|
||||
extern uint32_t android_hardware_HardwareBuffer_convertToPixelFormat(uint32_t format);
|
||||
|
||||
/* Convert from AHARDWAREBUFFER_USAGE* flags to to gralloc usage flags. */
|
||||
extern void android_hardware_HardwareBuffer_convertToGrallocUsageBits(
|
||||
uint64_t* outProducerUsage, uint64_t* outConsumerUsage, uint64_t usage0,
|
||||
uint64_t usage1);
|
||||
extern uint64_t android_hardware_HardwareBuffer_convertToGrallocUsageBits(uint64_t usage);
|
||||
|
||||
/* Convert from gralloc usage flags to to AHARDWAREBUFFER_USAGE0* flags. */
|
||||
extern void android_hardware_HardwareBuffer_convertFromGrallocUsageBits(
|
||||
uint64_t* outUsage0, uint64_t* outUsage1, uint64_t producerUsage,
|
||||
uint64_t consumerUsage);
|
||||
inline void android_hardware_HardwareBuffer_convertToGrallocUsageBits(
|
||||
uint64_t* outProducerUsage, uint64_t* outConsumerUsage, uint64_t usage, uint64_t) {
|
||||
outProducerUsage[0] = outConsumerUsage[0] =
|
||||
android_hardware_HardwareBuffer_convertToGrallocUsageBits(usage);
|
||||
}
|
||||
|
||||
} // namespace android
|
||||
|
||||
|
||||
@@ -728,15 +728,15 @@ public class ImageReader implements AutoCloseable {
|
||||
|
||||
if (format == ImageFormat.PRIVATE) {
|
||||
// Usage need to be either USAGE0_GPU_SAMPLED_IMAGE or USAGE0_VIDEO_ENCODE or combined.
|
||||
boolean isAllowed = (usage == HardwareBuffer.USAGE0_GPU_SAMPLED_IMAGE);
|
||||
isAllowed = isAllowed || (usage == HardwareBuffer.USAGE0_VIDEO_ENCODE);
|
||||
boolean isAllowed = (usage == HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE);
|
||||
isAllowed = isAllowed || (usage == HardwareBuffer.USAGE_VIDEO_ENCODE);
|
||||
isAllowed = isAllowed || (usage ==
|
||||
(HardwareBuffer.USAGE0_VIDEO_ENCODE | HardwareBuffer.USAGE0_GPU_SAMPLED_IMAGE));
|
||||
(HardwareBuffer.USAGE_VIDEO_ENCODE | HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE));
|
||||
return isAllowed;
|
||||
} else {
|
||||
// Usage need to make the buffer CPU readable for explicit format.
|
||||
return ((usage == HardwareBuffer.USAGE0_CPU_READ) ||
|
||||
(usage == HardwareBuffer.USAGE0_CPU_READ_OFTEN));
|
||||
return ((usage == HardwareBuffer.USAGE_CPU_READ_RARELY) ||
|
||||
(usage == HardwareBuffer.USAGE_CPU_READ_OFTEN));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user