mirror of
https://github.com/hrydgard/ppsspp.git
synced 2024-11-24 05:49:58 +00:00
Add check for tiling GPUs. We'll use this to inform on what MSAA modes to support.
This commit is contained in:
parent
4866518b84
commit
6daecb4e2b
@ -309,6 +309,8 @@ D3D11DrawContext::D3D11DrawContext(ID3D11Device *device, ID3D11DeviceContext *de
|
||||
dxgiDevice->Release();
|
||||
}
|
||||
|
||||
caps_.isTilingGPU = false;
|
||||
|
||||
// Temp texture for read-back of small images. Custom textures are created on demand for larger ones.
|
||||
// TODO: Should really benchmark if this extra complexity has any benefit.
|
||||
D3D11_TEXTURE2D_DESC packDesc{};
|
||||
|
@ -763,6 +763,7 @@ D3D9Context::D3D9Context(IDirect3D9 *d3d, IDirect3D9Ex *d3dEx, int adapterId, ID
|
||||
caps_.fragmentShaderDepthWriteSupported = true;
|
||||
caps_.fragmentShaderStencilWriteSupported = false;
|
||||
caps_.blendMinMaxSupported = true;
|
||||
caps_.isTilingGPU = false;
|
||||
|
||||
if ((caps.RasterCaps & D3DPRASTERCAPS_ANISOTROPY) != 0 && caps.MaxAnisotropy > 1) {
|
||||
caps_.anisoSupported = true;
|
||||
|
@ -601,6 +601,10 @@ OpenGLContext::OpenGLContext() {
|
||||
caps_.vendor = GPUVendor::VENDOR_UNKNOWN;
|
||||
break;
|
||||
}
|
||||
|
||||
// Very rough heuristic!
|
||||
caps_.isTilingGPU = gl_extensions.IsGLES && caps_.vendor != GPUVendor::VENDOR_NVIDIA && caps_.vendor != GPUVendor::VENDOR_INTEL;
|
||||
|
||||
for (int i = 0; i < GLRenderManager::MAX_INFLIGHT_FRAMES; i++) {
|
||||
frameData_[i].push = renderManager_.CreatePushBuffer(i, GL_ARRAY_BUFFER, 64 * 1024);
|
||||
}
|
||||
|
@ -329,7 +329,7 @@ bool VulkanContext::MemoryTypeFromProperties(uint32_t typeBits, VkFlags requirem
|
||||
for (uint32_t i = 0; i < 32; i++) {
|
||||
if ((typeBits & 1) == 1) {
|
||||
// Type is available, does it match user properties?
|
||||
if ((memory_properties.memoryTypes[i].propertyFlags & requirements_mask) == requirements_mask) {
|
||||
if ((memory_properties_.memoryTypes[i].propertyFlags & requirements_mask) == requirements_mask) {
|
||||
*typeIndex = i;
|
||||
return true;
|
||||
}
|
||||
@ -569,17 +569,17 @@ void VulkanContext::ChooseDevice(int physical_device) {
|
||||
}
|
||||
|
||||
// This is as good a place as any to do this.
|
||||
vkGetPhysicalDeviceMemoryProperties(physical_devices_[physical_device_], &memory_properties);
|
||||
INFO_LOG(G3D, "Memory Types (%d):", memory_properties.memoryTypeCount);
|
||||
for (int i = 0; i < (int)memory_properties.memoryTypeCount; i++) {
|
||||
vkGetPhysicalDeviceMemoryProperties(physical_devices_[physical_device_], &memory_properties_);
|
||||
INFO_LOG(G3D, "Memory Types (%d):", memory_properties_.memoryTypeCount);
|
||||
for (int i = 0; i < (int)memory_properties_.memoryTypeCount; i++) {
|
||||
// Don't bother printing dummy memory types.
|
||||
if (!memory_properties.memoryTypes[i].propertyFlags)
|
||||
if (!memory_properties_.memoryTypes[i].propertyFlags)
|
||||
continue;
|
||||
INFO_LOG(G3D, " %d: Heap %d; Flags: %s%s%s%s ", i, memory_properties.memoryTypes[i].heapIndex,
|
||||
(memory_properties.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) ? "DEVICE_LOCAL " : "",
|
||||
(memory_properties.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) ? "HOST_VISIBLE " : "",
|
||||
(memory_properties.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) ? "HOST_CACHED " : "",
|
||||
(memory_properties.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) ? "HOST_COHERENT " : "");
|
||||
INFO_LOG(G3D, " %d: Heap %d; Flags: %s%s%s%s ", i, memory_properties_.memoryTypes[i].heapIndex,
|
||||
(memory_properties_.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) ? "DEVICE_LOCAL " : "",
|
||||
(memory_properties_.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) ? "HOST_VISIBLE " : "",
|
||||
(memory_properties_.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) ? "HOST_CACHED " : "",
|
||||
(memory_properties_.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) ? "HOST_COHERENT " : "");
|
||||
}
|
||||
|
||||
// Optional features
|
||||
|
@ -283,6 +283,10 @@ public:
|
||||
return device_extensions_enabled_;
|
||||
}
|
||||
|
||||
const VkPhysicalDeviceMemoryProperties &GetMemoryProperties() const {
|
||||
return memory_properties_;
|
||||
}
|
||||
|
||||
struct PhysicalDeviceFeatures {
|
||||
AllPhysicalDeviceFeatures available{};
|
||||
AllPhysicalDeviceFeatures enabled{};
|
||||
@ -401,7 +405,8 @@ private:
|
||||
uint32_t graphics_queue_family_index_ = -1;
|
||||
std::vector<PhysicalDeviceProps> physicalDeviceProperties_;
|
||||
std::vector<VkQueueFamilyProperties> queueFamilyProperties_;
|
||||
VkPhysicalDeviceMemoryProperties memory_properties{};
|
||||
|
||||
VkPhysicalDeviceMemoryProperties memory_properties_{};
|
||||
|
||||
// Custom collection of things that are good to know
|
||||
VulkanPhysicalDeviceInfo deviceInfo_{};
|
||||
|
@ -845,6 +845,14 @@ VKContext::VKContext(VulkanContext *vulkan)
|
||||
default: caps_.vendor = GPUVendor::VENDOR_UNKNOWN; break;
|
||||
}
|
||||
|
||||
bool hasLazyMemory = false;
|
||||
for (u32 i = 0; i < vulkan->GetMemoryProperties().memoryTypeCount; i++) {
|
||||
if (vulkan->GetMemoryProperties().memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
|
||||
hasLazyMemory = true;
|
||||
}
|
||||
}
|
||||
caps_.isTilingGPU = hasLazyMemory;
|
||||
|
||||
if (caps_.vendor == GPUVendor::VENDOR_QUALCOMM) {
|
||||
// Adreno 5xx devices, all known driver versions, fail to discard stencil when depth write is off.
|
||||
// See: https://github.com/hrydgard/ppsspp/pull/11684
|
||||
|
@ -576,6 +576,7 @@ struct DeviceCaps {
|
||||
bool textureDepthSupported;
|
||||
bool blendMinMaxSupported;
|
||||
bool multiViewSupported;
|
||||
bool isTilingGPU; // This means that it benefits from correct store-ops, msaa without backing memory, etc.
|
||||
|
||||
std::string deviceName; // The device name to use when creating the thin3d context, to get the same one.
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user