mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-08 04:08:32 +09:00
[Fix] (MG_Backend/DirectVulkan): support layered texture framebuffers
This commit is contained in:
@@ -661,8 +661,12 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
||||
// Color attachment description
|
||||
VkAttachmentDescription& desc = attachmentDescriptions.back();
|
||||
switch (textureTarget) {
|
||||
case TextureTarget::Texture1D:
|
||||
case TextureTarget::Texture1DArray:
|
||||
case TextureTarget::Texture2D:
|
||||
case TextureTarget::Texture2DMultisample: {
|
||||
case TextureTarget::Texture2DArray:
|
||||
case TextureTarget::Texture2DMultisample:
|
||||
case TextureTarget::TextureRectangle: {
|
||||
desc.flags = 0;
|
||||
desc.format = isDefaultFbo ?
|
||||
m_swapchainObject.GetSurfaceFormat().format :
|
||||
|
||||
@@ -512,6 +512,22 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
||||
TextureUploadTarget uploadTarget, const IntVec3& texelSize,
|
||||
TextureShapeInfo& outShape) {
|
||||
switch (uploadTarget) {
|
||||
case TextureUploadTarget::Texture1D:
|
||||
case TextureUploadTarget::ProxyTexture1D:
|
||||
outShape = {};
|
||||
outShape.imageType = VK_IMAGE_TYPE_1D;
|
||||
outShape.viewType = VK_IMAGE_VIEW_TYPE_1D;
|
||||
return true;
|
||||
case TextureUploadTarget::Texture1DArray:
|
||||
case TextureUploadTarget::ProxyTexture1DArray:
|
||||
MOBILEGL_ASSERT(texelSize.z() > 0,
|
||||
"TryResolveTextureShapeInfo: invalid 1D array depth=%d for textureId=%d",
|
||||
texelSize.z(), texture.GetExternalIndex());
|
||||
outShape.imageType = VK_IMAGE_TYPE_1D;
|
||||
outShape.viewType = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
|
||||
outShape.depth = 1;
|
||||
outShape.arrayLayers = static_cast<Uint32>(texelSize.z());
|
||||
return true;
|
||||
case TextureUploadTarget::Texture2D:
|
||||
case TextureUploadTarget::ProxyTexture2D:
|
||||
case TextureUploadTarget::TextureRectangle:
|
||||
|
||||
@@ -923,26 +923,11 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
||||
return false;
|
||||
}
|
||||
|
||||
static Bool HasLayeredTextureAttachment(const MG_State::GLState::FramebufferObject& framebufferObject) {
|
||||
if (framebufferObject.GetExternalIndex() == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (const auto& attachment : framebufferObject.GetAllAttachmentObjects()) {
|
||||
if (attachment.IsTexture() && attachment.IsLayered()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static Bool IsUnsupportedFramebufferForDirectVulkan(
|
||||
const MG_State::GLState::FramebufferObject& framebufferObject) {
|
||||
// TODO: Revisit this gate when DirectVulkan has full color renderbuffer render/blit/readback support.
|
||||
// TODO: Implement DirectVulkan layered framebuffer rendering instead of rejecting layered draw targets.
|
||||
return HasDistinctCompleteDepthStencilTextureAttachments(framebufferObject) ||
|
||||
HasUnsupportedCompleteRenderbufferAttachment(framebufferObject) ||
|
||||
HasLayeredTextureAttachment(framebufferObject);
|
||||
HasUnsupportedCompleteRenderbufferAttachment(framebufferObject);
|
||||
}
|
||||
|
||||
static void RecordUnsupportedFramebufferError(const char* func) {
|
||||
@@ -4929,9 +4914,9 @@ void main() {
|
||||
|
||||
void VulkanRenderer::GenerateMipmap(GLenum target) {
|
||||
const auto textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target);
|
||||
MOBILEGL_ASSERT(textureTarget == TextureTarget::Texture2D || textureTarget == TextureTarget::Texture3D ||
|
||||
textureTarget == TextureTarget::TextureCubeMap,
|
||||
"GenerateMipmap currently only supports GL_TEXTURE_2D, GL_TEXTURE_3D, and GL_TEXTURE_CUBE_MAP.");
|
||||
MOBILEGL_ASSERT(textureTarget == TextureTarget::Texture2D || textureTarget == TextureTarget::Texture2DArray ||
|
||||
textureTarget == TextureTarget::Texture3D || textureTarget == TextureTarget::TextureCubeMap,
|
||||
"GenerateMipmap currently only supports GL_TEXTURE_2D, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D, and GL_TEXTURE_CUBE_MAP.");
|
||||
|
||||
auto& textureUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit());
|
||||
auto texture = textureUnit.GetBindingSlot(textureTarget).GetBoundObject();
|
||||
|
||||
Reference in New Issue
Block a user