// Copyright (C) 2024 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

import "VirtioGpuRingBlobSnapshot.proto";

package gfxstream.host.snapshot;

// LINT.IfChange(virtio_gpu_resource_type)
enum VirtioGpuResourceType {
    UNKNOWN = 0;
    PIPE = 1;
    BUFFER = 2;
    COLOR_BUFFER = 3;
    BLOB = 4;
}
// LINT.ThenChange(VirtioGpuResource.h:virtio_gpu_resource_type)

message VirtioGpuResourceCreateArgs {
    optional uint32 id = 1;
    optional uint32 target = 2;
    optional uint32 format = 3;
    optional uint32 bind = 4;
    optional uint32 width = 5;
    optional uint32 height = 6;
    optional uint32 depth = 7;
    optional uint32 array_size = 8;
    optional uint32 last_level = 9;
    optional uint32 nr_samples = 10;
    optional uint32 flags = 11;
}

message VirtioGpuResourceCreateBlobArgs {
    optional uint32 mem = 1;
    optional uint32 flags = 2;
    optional uint32 id = 3;
    optional uint64 size = 4;
}

// NOTE: This does not actually save the blob's external memory because the handle
// or mapping may not be the same across snapshot and restore. This instead saves
// the info needed to refetch either the descriptor or mapping from
// `ExternalObjectManager` after a restore.
message VirtioGpuBlobExternalMemoryInfo {
    optional uint32 context_id = 1;
    optional uint32 blob_id = 2;
}

// LINT.IfChange(virtio_gpu_resource)
message VirtioGpuResourceSnapshot {
    optional uint32 id = 1;
    optional VirtioGpuResourceType type = 2;
    optional VirtioGpuResourceCreateArgs create_args = 3;
    optional VirtioGpuResourceCreateBlobArgs create_blob_args = 4;
    // NOTE: `VirtioGpuResource::iovs` is not saved because the host virtual address
    // may not be the same across snapshot and restore. VMMs are expected to re-call
    // `stream_renderer_resource_attach_iov()` for resources with the new guest-memory
    // host virtual addresses.
    oneof blob_memory {
        VirtioGpuRingBlobSnapshot ring_blob = 5;
        VirtioGpuBlobExternalMemoryInfo external_memory_descriptor = 6;
        VirtioGpuBlobExternalMemoryInfo external_memory_mapping = 7;
    }
    optional uint32 latest_attached_context = 8;
    repeated uint32 attached_contexts = 9;
}
// LINT.ThenChange(VirtioGpuResource.h:virtio_gpu_resource)
