mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-11 13:48:30 +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
|
// Color attachment description
|
||||||
VkAttachmentDescription& desc = attachmentDescriptions.back();
|
VkAttachmentDescription& desc = attachmentDescriptions.back();
|
||||||
switch (textureTarget) {
|
switch (textureTarget) {
|
||||||
|
case TextureTarget::Texture1D:
|
||||||
|
case TextureTarget::Texture1DArray:
|
||||||
case TextureTarget::Texture2D:
|
case TextureTarget::Texture2D:
|
||||||
case TextureTarget::Texture2DMultisample: {
|
case TextureTarget::Texture2DArray:
|
||||||
|
case TextureTarget::Texture2DMultisample:
|
||||||
|
case TextureTarget::TextureRectangle: {
|
||||||
desc.flags = 0;
|
desc.flags = 0;
|
||||||
desc.format = isDefaultFbo ?
|
desc.format = isDefaultFbo ?
|
||||||
m_swapchainObject.GetSurfaceFormat().format :
|
m_swapchainObject.GetSurfaceFormat().format :
|
||||||
|
|||||||
@@ -512,6 +512,22 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
|||||||
TextureUploadTarget uploadTarget, const IntVec3& texelSize,
|
TextureUploadTarget uploadTarget, const IntVec3& texelSize,
|
||||||
TextureShapeInfo& outShape) {
|
TextureShapeInfo& outShape) {
|
||||||
switch (uploadTarget) {
|
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::Texture2D:
|
||||||
case TextureUploadTarget::ProxyTexture2D:
|
case TextureUploadTarget::ProxyTexture2D:
|
||||||
case TextureUploadTarget::TextureRectangle:
|
case TextureUploadTarget::TextureRectangle:
|
||||||
|
|||||||
@@ -923,26 +923,11 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
|||||||
return false;
|
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(
|
static Bool IsUnsupportedFramebufferForDirectVulkan(
|
||||||
const MG_State::GLState::FramebufferObject& framebufferObject) {
|
const MG_State::GLState::FramebufferObject& framebufferObject) {
|
||||||
// TODO: Revisit this gate when DirectVulkan has full color renderbuffer render/blit/readback support.
|
// 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) ||
|
return HasDistinctCompleteDepthStencilTextureAttachments(framebufferObject) ||
|
||||||
HasUnsupportedCompleteRenderbufferAttachment(framebufferObject) ||
|
HasUnsupportedCompleteRenderbufferAttachment(framebufferObject);
|
||||||
HasLayeredTextureAttachment(framebufferObject);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void RecordUnsupportedFramebufferError(const char* func) {
|
static void RecordUnsupportedFramebufferError(const char* func) {
|
||||||
@@ -4929,9 +4914,9 @@ void main() {
|
|||||||
|
|
||||||
void VulkanRenderer::GenerateMipmap(GLenum target) {
|
void VulkanRenderer::GenerateMipmap(GLenum target) {
|
||||||
const auto textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target);
|
const auto textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target);
|
||||||
MOBILEGL_ASSERT(textureTarget == TextureTarget::Texture2D || textureTarget == TextureTarget::Texture3D ||
|
MOBILEGL_ASSERT(textureTarget == TextureTarget::Texture2D || textureTarget == TextureTarget::Texture2DArray ||
|
||||||
textureTarget == TextureTarget::TextureCubeMap,
|
textureTarget == TextureTarget::Texture3D || textureTarget == TextureTarget::TextureCubeMap,
|
||||||
"GenerateMipmap currently only supports GL_TEXTURE_2D, GL_TEXTURE_3D, and GL_TEXTURE_CUBE_MAP.");
|
"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& textureUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit());
|
||||||
auto texture = textureUnit.GetBindingSlot(textureTarget).GetBoundObject();
|
auto texture = textureUnit.GetBindingSlot(textureTarget).GetBoundObject();
|
||||||
|
|||||||
Reference in New Issue
Block a user