syntax = "proto2";
option optimize_for = LITE_RUNTIME;

message Trace {
    repeated Increment increment = 1;
}

message Increment {
    required int64 time_stamp = 1;

    oneof increment {
        Transaction        transaction          = 2;
        SurfaceCreation    surface_creation     = 3;
        SurfaceDeletion    surface_deletion     = 4;
        BufferUpdate       buffer_update        = 5;
        VSyncEvent         vsync_event          = 6;
        DisplayCreation    display_creation     = 7;
        DisplayDeletion    display_deletion     = 8;
        PowerModeUpdate    power_mode_update    = 9;
    }
}

message Transaction {
    repeated SurfaceChange surface_change = 1;
    repeated DisplayChange display_change = 2;

    required bool synchronous = 3;
    required bool animation   = 4;
}

message SurfaceChange {
    required int32 id = 1;

    oneof SurfaceChange {
        PositionChange              position                = 2;
        SizeChange                  size                    = 3;
        AlphaChange                 alpha                   = 4;
        LayerChange                 layer                   = 5;
        CropChange                  crop                    = 6;
        FinalCropChange             final_crop              = 7;
        MatrixChange                matrix                  = 8;
        OverrideScalingModeChange   override_scaling_mode   = 9;
        TransparentRegionHintChange transparent_region_hint = 10;
        LayerStackChange            layer_stack             = 11;
        HiddenFlagChange            hidden_flag             = 12;
        OpaqueFlagChange            opaque_flag             = 13;
        SecureFlagChange            secure_flag             = 14;
        DeferredTransactionChange   deferred_transaction    = 15;
    }
}

message PositionChange {
    required float x = 1;
    required float y = 2;
}

message SizeChange {
    required uint32 w = 1;
    required uint32 h = 2;
}

message AlphaChange {
    required float alpha = 1;
}

message LayerChange {
    required uint32 layer = 1;
}

message CropChange {
    required Rectangle rectangle = 1;
}

message FinalCropChange {
    required Rectangle rectangle = 1;
}

message MatrixChange {
    required float dsdx = 1;
    required float dtdx = 2;
    required float dsdy = 3;
    required float dtdy = 4;
}

message OverrideScalingModeChange {
    required int32 override_scaling_mode = 1;
}

message TransparentRegionHintChange {
    repeated Rectangle region = 1;
}

message LayerStackChange {
    required uint32 layer_stack = 1;
}

message HiddenFlagChange {
    required bool hidden_flag = 1;
}

message OpaqueFlagChange {
    required bool opaque_flag = 1;
}

message SecureFlagChange {
    required bool secure_flag = 1;
}

message DeferredTransactionChange {
    required int32  layer_id     = 1;
    required uint64 frame_number = 2;
}

message DisplayChange {
    required int32 id = 1;

    oneof DisplayChange {
        DispSurfaceChange surface     = 2;
        LayerStackChange  layer_stack = 3;
        SizeChange        size        = 4;
        ProjectionChange  projection  = 5;
    }
}

message DispSurfaceChange {
    required uint64 buffer_queue_id   = 1;
    required string buffer_queue_name = 2;
}

message ProjectionChange {
    required int32     orientation = 1;
    required Rectangle viewport    = 2;
    required Rectangle frame       = 3;
}

message Rectangle {
    required int32 left   = 1;
    required int32 top    = 2;
    required int32 right  = 3;
    required int32 bottom = 4;
}

message SurfaceCreation {
    required int32  id   = 1;
    required string name = 2;
    required uint32 w    = 3;
    required uint32 h    = 4;
}

message SurfaceDeletion {
    required int32 id = 1;
}

message BufferUpdate {
    required int32  id           = 1;
    required uint32 w            = 2;
    required uint32 h            = 3;
    required uint64 frame_number = 4;
}

message VSyncEvent {
    required int64 when = 1;
}

message DisplayCreation {
    required int32     id                = 1;
    required string    name              = 2;
    required int32     type              = 3;
    required bool      is_secure         = 4;
}

message DisplayDeletion {
    required int32 id = 1;
}

message PowerModeUpdate {
    required int32  id   = 1;
    required int32  mode = 2;
}
