// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: test/custom_results/graphics/trace.proto

package graphics

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// Details about a graphics trace file.
// Next Tag: 10
type Trace struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Global unique trace identifier.
	Id       *TraceId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	Filename string   `protobuf:"bytes,2,opt,name=filename,proto3" json:"filename,omitempty"`
	Size     uint64   `protobuf:"varint,3,opt,name=size,proto3" json:"size,omitempty"`
	// Source of the trace.
	Source string `protobuf:"bytes,4,opt,name=source,proto3" json:"source,omitempty"`
	// Source specific identifier for the program being traced. (eg Steam ID)
	ApplicationId string `protobuf:"bytes,5,opt,name=application_id,json=applicationId,proto3" json:"application_id,omitempty"`
	// Number of frames in the trace.
	FrameCount uint32 `protobuf:"varint,6,opt,name=frame_count,json=frameCount,proto3" json:"frame_count,omitempty"`
	// The range of frames after the game began to interact.
	FrameRange *Trace_Range `protobuf:"bytes,7,opt,name=frame_range,json=frameRange,proto3" json:"frame_range,omitempty"`
	// Frames that are worth checking for pixel correctness.
	KeyFrames []uint32 `protobuf:"varint,8,rep,packed,name=key_frames,json=keyFrames,proto3" json:"key_frames,omitempty"`
	// Frames that are worth looping on to gauge performance.
	LoopFrames []uint32 `protobuf:"varint,9,rep,packed,name=loop_frames,json=loopFrames,proto3" json:"loop_frames,omitempty"`
}

func (x *Trace) Reset() {
	*x = Trace{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_custom_results_graphics_trace_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Trace) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Trace) ProtoMessage() {}

func (x *Trace) ProtoReflect() protoreflect.Message {
	mi := &file_test_custom_results_graphics_trace_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Trace.ProtoReflect.Descriptor instead.
func (*Trace) Descriptor() ([]byte, []int) {
	return file_test_custom_results_graphics_trace_proto_rawDescGZIP(), []int{0}
}

func (x *Trace) GetId() *TraceId {
	if x != nil {
		return x.Id
	}
	return nil
}

func (x *Trace) GetFilename() string {
	if x != nil {
		return x.Filename
	}
	return ""
}

func (x *Trace) GetSize() uint64 {
	if x != nil {
		return x.Size
	}
	return 0
}

func (x *Trace) GetSource() string {
	if x != nil {
		return x.Source
	}
	return ""
}

func (x *Trace) GetApplicationId() string {
	if x != nil {
		return x.ApplicationId
	}
	return ""
}

func (x *Trace) GetFrameCount() uint32 {
	if x != nil {
		return x.FrameCount
	}
	return 0
}

func (x *Trace) GetFrameRange() *Trace_Range {
	if x != nil {
		return x.FrameRange
	}
	return nil
}

func (x *Trace) GetKeyFrames() []uint32 {
	if x != nil {
		return x.KeyFrames
	}
	return nil
}

func (x *Trace) GetLoopFrames() []uint32 {
	if x != nil {
		return x.LoopFrames
	}
	return nil
}

type TraceList struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Value []*Trace `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
}

func (x *TraceList) Reset() {
	*x = TraceList{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_custom_results_graphics_trace_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TraceList) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TraceList) ProtoMessage() {}

func (x *TraceList) ProtoReflect() protoreflect.Message {
	mi := &file_test_custom_results_graphics_trace_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TraceList.ProtoReflect.Descriptor instead.
func (*TraceList) Descriptor() ([]byte, []int) {
	return file_test_custom_results_graphics_trace_proto_rawDescGZIP(), []int{1}
}

func (x *TraceList) GetValue() []*Trace {
	if x != nil {
		return x.Value
	}
	return nil
}

type Trace_Range struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Start uint32 `protobuf:"varint,1,opt,name=start,proto3" json:"start,omitempty"`
	End   uint32 `protobuf:"varint,2,opt,name=end,proto3" json:"end,omitempty"`
}

func (x *Trace_Range) Reset() {
	*x = Trace_Range{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_custom_results_graphics_trace_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Trace_Range) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Trace_Range) ProtoMessage() {}

func (x *Trace_Range) ProtoReflect() protoreflect.Message {
	mi := &file_test_custom_results_graphics_trace_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Trace_Range.ProtoReflect.Descriptor instead.
func (*Trace_Range) Descriptor() ([]byte, []int) {
	return file_test_custom_results_graphics_trace_proto_rawDescGZIP(), []int{0, 0}
}

func (x *Trace_Range) GetStart() uint32 {
	if x != nil {
		return x.Start
	}
	return 0
}

func (x *Trace_Range) GetEnd() uint32 {
	if x != nil {
		return x.End
	}
	return 0
}

var File_test_custom_results_graphics_trace_proto protoreflect.FileDescriptor

var file_test_custom_results_graphics_trace_proto_rawDesc = []byte{
	0x0a, 0x28, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65,
	0x73, 0x75, 0x6c, 0x74, 0x73, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2f, 0x74,
	0x72, 0x61, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1c, 0x74, 0x65, 0x73, 0x74,
	0x2e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e,
	0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x1a, 0x2b, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x63,
	0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2f, 0x67, 0x72,
	0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8b, 0x03, 0x0a, 0x05, 0x54, 0x72, 0x61, 0x63, 0x65, 0x12,
	0x35, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x65,
	0x73, 0x74, 0x2e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,
	0x73, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65,
	0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61,
	0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61,
	0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04,
	0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x25,
	0x0a, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64,
	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x63,
	0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x66, 0x72, 0x61, 0x6d,
	0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x4a, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f,
	0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x65,
	0x73, 0x74, 0x2e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,
	0x73, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65,
	0x2e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0a, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x61, 0x6e,
	0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73,
	0x18, 0x08, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65,
	0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x6f, 0x6f, 0x70, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73,
	0x18, 0x09, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x6f, 0x6f, 0x70, 0x46, 0x72, 0x61, 0x6d,
	0x65, 0x73, 0x1a, 0x2f, 0x0a, 0x05, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73,
	0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72,
	0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03,
	0x65, 0x6e, 0x64, 0x22, 0x46, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74,
	0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
	0x23, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65,
	0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x54,
	0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x48, 0x5a, 0x46, 0x67,
	0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x63, 0x75,
	0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2f, 0x67, 0x72, 0x61,
	0x70, 0x68, 0x69, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_custom_results_graphics_trace_proto_rawDescOnce sync.Once
	file_test_custom_results_graphics_trace_proto_rawDescData = file_test_custom_results_graphics_trace_proto_rawDesc
)

func file_test_custom_results_graphics_trace_proto_rawDescGZIP() []byte {
	file_test_custom_results_graphics_trace_proto_rawDescOnce.Do(func() {
		file_test_custom_results_graphics_trace_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_custom_results_graphics_trace_proto_rawDescData)
	})
	return file_test_custom_results_graphics_trace_proto_rawDescData
}

var file_test_custom_results_graphics_trace_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_test_custom_results_graphics_trace_proto_goTypes = []interface{}{
	(*Trace)(nil),       // 0: test.custom_results.graphics.Trace
	(*TraceList)(nil),   // 1: test.custom_results.graphics.TraceList
	(*Trace_Range)(nil), // 2: test.custom_results.graphics.Trace.Range
	(*TraceId)(nil),     // 3: test.custom_results.graphics.TraceId
}
var file_test_custom_results_graphics_trace_proto_depIdxs = []int32{
	3, // 0: test.custom_results.graphics.Trace.id:type_name -> test.custom_results.graphics.TraceId
	2, // 1: test.custom_results.graphics.Trace.frame_range:type_name -> test.custom_results.graphics.Trace.Range
	0, // 2: test.custom_results.graphics.TraceList.value:type_name -> test.custom_results.graphics.Trace
	3, // [3:3] is the sub-list for method output_type
	3, // [3:3] is the sub-list for method input_type
	3, // [3:3] is the sub-list for extension type_name
	3, // [3:3] is the sub-list for extension extendee
	0, // [0:3] is the sub-list for field type_name
}

func init() { file_test_custom_results_graphics_trace_proto_init() }
func file_test_custom_results_graphics_trace_proto_init() {
	if File_test_custom_results_graphics_trace_proto != nil {
		return
	}
	file_test_custom_results_graphics_trace_id_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_test_custom_results_graphics_trace_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Trace); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_custom_results_graphics_trace_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TraceList); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_custom_results_graphics_trace_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Trace_Range); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_test_custom_results_graphics_trace_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   3,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_custom_results_graphics_trace_proto_goTypes,
		DependencyIndexes: file_test_custom_results_graphics_trace_proto_depIdxs,
		MessageInfos:      file_test_custom_results_graphics_trace_proto_msgTypes,
	}.Build()
	File_test_custom_results_graphics_trace_proto = out.File
	file_test_custom_results_graphics_trace_proto_rawDesc = nil
	file_test_custom_results_graphics_trace_proto_goTypes = nil
	file_test_custom_results_graphics_trace_proto_depIdxs = nil
}
