forked from google/gapid
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathstate.go
112 lines (97 loc) · 4.24 KB
/
state.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Copyright (C) 2017 Google Inc.
//
// 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.
package vulkan
import (
"fmt"
"github.com/google/gapid/gapis/api"
)
func (st *State) getSubmitAttachmentInfo(attachment api.FramebufferAttachment) (w, h uint32, f VkFormat, attachmentIndex uint32, err error) {
returnError := func(format_str string, e ...interface{}) (w, h uint32, f VkFormat, attachmentIndex uint32, err error) {
return 0, 0, VkFormat_VK_FORMAT_UNDEFINED, 0, fmt.Errorf(format_str, e...)
}
lastQueue := st.LastBoundQueue
if lastQueue == nil {
return returnError("No previous queue submission")
}
lastDrawInfo, ok := st.LastDrawInfos.Lookup(lastQueue.VulkanHandle)
if !ok {
return returnError("There have been no previous draws")
}
if lastDrawInfo.Framebuffer == nil || !st.Framebuffers.Contains(lastDrawInfo.Framebuffer.VulkanHandle) {
return returnError("%s is not bound", attachment)
}
if lastDrawInfo.Framebuffer.RenderPass == nil {
return returnError("%s is not bound to any renderpass", attachment)
}
lastSubpass := lastDrawInfo.LastSubpass
subpass_desc := lastDrawInfo.Framebuffer.RenderPass.SubpassDescriptions.Get(lastSubpass)
switch attachment {
case api.FramebufferAttachment_Color0,
api.FramebufferAttachment_Color1,
api.FramebufferAttachment_Color2,
api.FramebufferAttachment_Color3:
attachment_index := uint32(attachment - api.FramebufferAttachment_Color0)
if att_ref, ok := subpass_desc.ColorAttachments.Lookup(attachment_index); ok {
if ca, ok := lastDrawInfo.Framebuffer.ImageAttachments.Lookup(att_ref.Attachment); ok {
return ca.Image.Info.Extent.Width, ca.Image.Info.Extent.Height, ca.Image.Info.Format, att_ref.Attachment, nil
}
}
case api.FramebufferAttachment_Depth:
if subpass_desc.DepthStencilAttachment != nil && lastDrawInfo.Framebuffer != nil {
att_ref := subpass_desc.DepthStencilAttachment
if attachment, ok := lastDrawInfo.Framebuffer.ImageAttachments.Lookup(att_ref.Attachment); ok {
depth_img := attachment.Image
return depth_img.Info.Extent.Width, depth_img.Info.Extent.Height, depth_img.Info.Format, att_ref.Attachment, nil
}
}
case api.FramebufferAttachment_Stencil:
fallthrough
default:
return returnError("Framebuffer attachment %v currently unsupported", attachment)
}
return returnError("%s is not bound", attachment)
}
func (st *State) getPresentAttachmentInfo(attachment api.FramebufferAttachment) (w, h uint32, f VkFormat, attachmentIndex uint32, err error) {
returnError := func(format_str string, e ...interface{}) (w, h uint32, f VkFormat, attachmentIndex uint32, err error) {
return 0, 0, VkFormat_VK_FORMAT_UNDEFINED, 0, fmt.Errorf(format_str, e...)
}
switch attachment {
case api.FramebufferAttachment_Color0,
api.FramebufferAttachment_Color1,
api.FramebufferAttachment_Color2,
api.FramebufferAttachment_Color3:
image_idx := uint32(attachment - api.FramebufferAttachment_Color0)
if st.LastPresentInfo.PresentImageCount <= image_idx {
return returnError("Swapchain does not contain image %v", attachment)
}
color_img := st.LastPresentInfo.PresentImages.Get(image_idx)
if color_img != nil {
return color_img.Info.Extent.Width, color_img.Info.Extent.Height, color_img.Info.Format, image_idx, nil
}
case api.FramebufferAttachment_Depth:
fallthrough
case api.FramebufferAttachment_Stencil:
fallthrough
default:
return returnError("Swapchain attachment %v does not exist", attachment)
}
return returnError("Swapchain attachment %v does not exist", attachment)
}
func (st *State) getFramebufferAttachmentInfo(attachment api.FramebufferAttachment) (uint32, uint32, VkFormat, uint32, error) {
if st.LastSubmission == LastSubmissionType_SUBMIT {
return st.getSubmitAttachmentInfo(attachment)
} else {
return st.getPresentAttachmentInfo(attachment)
}
}