blob: 0d01568bbd4427011bb27eaf2f6e4bf61068cf8a [file]
/* Copyright (c) 2026 The Khronos Group Inc.
* Copyright (c) 2026 Valve Corporation
* Copyright (c) 2026 LunarG, 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.
*/
#include "vertex_index_buffer_state.h"
#include "error_message/error_strings.h"
#include "state_tracker/buffer_state.h"
#include "state_tracker/state_tracker.h"
#include <sstream>
namespace vvl {
VkBuffer VertexBufferBinding::Handle(const vvl::DeviceState& device) const {
if (address != 0) {
const auto buffer_states = device.GetBuffersByAddress(address);
for (const auto buffer_state : buffer_states) {
// Only return a buffer that makes sense
if (buffer_state && ((buffer_state->usage & VK_BUFFER_USAGE_2_VERTEX_BUFFER_BIT) != 0)) {
return buffer_state->VkHandle();
}
}
}
return buffer; // acts as "null" if |address| isn't set
}
VkBuffer IndexBufferBinding::Handle(const vvl::DeviceState& device) const {
if (address != 0) {
const auto buffer_states = device.GetBuffersByAddress(address);
for (const auto buffer_state : buffer_states) {
// Only return a buffer that makes sense
if (buffer_state && ((buffer_state->usage & VK_BUFFER_USAGE_2_INDEX_BUFFER_BIT) != 0)) {
return buffer_state->VkHandle();
}
}
}
return buffer; // acts as "null" if |address| isn't set
}
std::string VertexBufferBinding::String(const vvl::DeviceState& device) const {
std::stringstream ss;
ss << "Vertex buffer binding info:\n";
if (buffer) {
ss << "- Buffer: " << device.FormatHandle(buffer) << '\n';
ss << "- Binding offset: " << offset << '\n';
} else {
ss << "- Address: 0x" << std::hex << address << std::dec << '\n';
std::string buffers_list_str = string_BuffersFromAddress(device, address);
if (!buffers_list_str.empty()) {
ss << "Pertains to the following buffers:\n" << buffers_list_str << '\n';
}
}
ss << "- Effective size: " << effective_size << " bytes\n";
ss << "- Stride: " << stride << " bytes\n";
return ss.str();
}
std::string IndexBufferBinding::String(const vvl::DeviceState& device) const {
std::stringstream ss;
ss << "Index buffer binding info:\n";
ss << "- Index type: " << string_VkIndexType(index_type) << '\n';
if (buffer) {
ss << "- Buffer: " << device.FormatHandle(buffer) << '\n';
ss << "- Binding offset: " << offset << '\n';
} else {
ss << "- Address: 0x" << std::hex << address << std::dec << '\n';
std::string buffers_list_str = string_BuffersFromAddress(device, address);
if (!buffers_list_str.empty()) {
ss << "Pertains to the following buffers:\n" << buffers_list_str << '\n';
}
}
ss << "- Binding size: " << size << " bytes\n";
return ss.str();
}
} // namespace vvl