////////////////////////////////////////////////////////////////////////////////
// Do not modify!
// Generated by rpcapi
////////////////////////////////////////////////////////////////////////////////

package service

import (
	"fmt"
	"io"
	"runtime/debug"

	"android.googlesource.com/platform/tools/gpu/binary"
	"android.googlesource.com/platform/tools/gpu/config"
	"android.googlesource.com/platform/tools/gpu/log"
	"android.googlesource.com/platform/tools/gpu/rpc"
)

func BindServer(r io.Reader, w io.Writer, mtu int, l log.Logger, server RPC) {
	rpc.Serve(l, r, w, mtu, func(in interface{}) (res binary.Object) {
		l := l.Fork().Enter(fmt.Sprintf("%v", in))
		defer func() {
			if err := recover(); err == nil {
				if config.DebugRPCCalls {
					l.Infof("returned: %v", res)
				}
			} else {
				msg := fmt.Sprintf("Panic: %v\n%v", err, string(debug.Stack()))
				l.Errorf(msg)
				res = rpc.NewError(msg)
			}
		}()
		switch call := in.(type) {
		case *callImport:
			if res, err := server.Import(l, call.name, call.Data); err == nil {
				return &resultImport{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callGetCaptures:
			if res, err := server.GetCaptures(l); err == nil {
				return &resultGetCaptures{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callGetDevices:
			if res, err := server.GetDevices(l); err == nil {
				return &resultGetDevices{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callGetState:
			if res, err := server.GetState(l, call.capture, call.after); err == nil {
				return &resultGetState{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callGetHierarchy:
			if res, err := server.GetHierarchy(l, call.capture); err == nil {
				return &resultGetHierarchy{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callGetMemoryInfo:
			if res, err := server.GetMemoryInfo(l, call.capture, call.after, call.rng); err == nil {
				return &resultGetMemoryInfo{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callGetFramebufferColor:
			if res, err := server.GetFramebufferColor(l, call.device, call.capture, call.api, call.after, call.settings); err == nil {
				return &resultGetFramebufferColor{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callGetFramebufferDepth:
			if res, err := server.GetFramebufferDepth(l, call.device, call.capture, call.api, call.after); err == nil {
				return &resultGetFramebufferDepth{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callGetTimingInfo:
			if res, err := server.GetTimingInfo(l, call.device, call.capture, call.mask); err == nil {
				return &resultGetTimingInfo{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callPrerenderFramebuffers:
			if res, err := server.PrerenderFramebuffers(l, call.device, call.capture, call.api, call.width, call.height, call.atomIds); err == nil {
				return &resultPrerenderFramebuffers{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callReplaceAtom:
			if res, err := server.ReplaceAtom(l, call.capture, call.atomId, call.atomType, call.data); err == nil {
				return &resultReplaceAtom{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callResolveAtomStream:
			if res, err := server.ResolveAtomStream(l, call.id); err == nil {
				return &resultResolveAtomStream{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callResolveBinary:
			if res, err := server.ResolveBinary(l, call.id); err == nil {
				return &resultResolveBinary{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callResolveCapture:
			if res, err := server.ResolveCapture(l, call.id); err == nil {
				return &resultResolveCapture{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callResolveDevice:
			if res, err := server.ResolveDevice(l, call.id); err == nil {
				return &resultResolveDevice{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callResolveHierarchy:
			if res, err := server.ResolveHierarchy(l, call.id); err == nil {
				return &resultResolveHierarchy{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callResolveImageInfo:
			if res, err := server.ResolveImageInfo(l, call.id); err == nil {
				return &resultResolveImageInfo{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callResolveMemoryInfo:
			if res, err := server.ResolveMemoryInfo(l, call.id); err == nil {
				return &resultResolveMemoryInfo{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callResolveSchema:
			if res, err := server.ResolveSchema(l, call.id); err == nil {
				return &resultResolveSchema{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callResolveTimingInfo:
			if res, err := server.ResolveTimingInfo(l, call.id); err == nil {
				return &resultResolveTimingInfo{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		default:
			return rpc.NewError("Unexpected RPC function: %T", call)
		}
	})
}
