Merge "Plumb gralloc producer/consumer bits correctly" into oc-dev

This commit is contained in:
Mathias Agopian
2017-04-28 00:29:28 +00:00
committed by Android (Google) Code Review
8 changed files with 83 additions and 111 deletions

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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);
}

View File

@@ -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(

View File

@@ -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

View File

@@ -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

View File

@@ -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));
}
}