diff --git a/source/blender/gpu/metal/kernels/compute_texture_read.msl b/source/blender/gpu/metal/kernels/compute_texture_read.msl index 41d7b312dbd..6c099024f7a 100644 --- a/source/blender/gpu/metal/kernels/compute_texture_read.msl +++ b/source/blender/gpu/metal/kernels/compute_texture_read.msl @@ -62,11 +62,24 @@ template<> uint denormalize(float val) return uint(float(DEPTH_SCALE_FACTOR) * val); } +/* Float to other type case. */ template T convert_type(float type) { return T(type); } +/* Uint to other types. */ +template T convert_type(uint type) +{ + return T(type); +} + +/* Int to other types. */ +template T convert_type(int type) +{ + return T(type); +} + template<> uchar convert_type(float val) { return uchar(val * float(0xFF)); @@ -141,8 +154,8 @@ kernel void compute_texture_read(constant TextureReadParams ¶ms [[buffer(0)] uint xx = position[0]; uint yy = position[1]; uint zz = position[2]; - int index = (zz * (params.extent[0] * params.extent[1]) + yy * params.extnt[0] + xx) * - COMPONENT_COUNT_INPUT; + int index = (zz * (params.extent[0] * params.extent[1]) + yy * params.extent[0] + xx) * + COMPONENT_COUNT_OUTPUT; read_colour = read_tex.read(uint3(params.offset[0], params.offset[1], params.offset[2]) + uint3(xx, yy, zz)); @@ -163,7 +176,7 @@ kernel void compute_texture_read(constant TextureReadParams ¶ms [[buffer(0)] uint yy = position[1]; uint layer = position[2]; int index = (layer * (params.extent[0] * params.extent[1]) + yy * params.extent[0] + xx) * - COMPONENT_COUNT_INPUT; + COMPONENT_COUNT_OUTPUT; /* Read data */ # if IS_DEPTH_FORMAT == 1 diff --git a/source/blender/gpu/metal/mtl_framebuffer.mm b/source/blender/gpu/metal/mtl_framebuffer.mm index 5e3a4136d88..86b7601a3cc 100644 --- a/source/blender/gpu/metal/mtl_framebuffer.mm +++ b/source/blender/gpu/metal/mtl_framebuffer.mm @@ -606,17 +606,6 @@ void MTLFrameBuffer::update_attachments(bool update_viewport) if (!dirty_attachments_) { return; } - - /* Cache viewport and scissor (If we have existing attachments). */ - int t_viewport[4], t_scissor[4]; - update_viewport = update_viewport && - (this->get_attachment_count() > 0 && this->has_depth_attachment() && - this->has_stencil_attachment()); - if (update_viewport) { - this->viewport_get(t_viewport); - this->scissor_get(t_scissor); - } - /* Clear current attachments state. */ this->remove_all_attachments(); @@ -738,22 +727,25 @@ void MTLFrameBuffer::update_attachments(bool update_viewport) } } - /* Check whether the first attachment is SRGB. */ + /* Extract attachment size and determine if framebuffer is SRGB. */ if (first_attachment != GPU_FB_MAX_ATTACHMENT) { - srgb_ = (first_attachment_mtl.texture->format_get() == GPU_SRGB8_A8); - } - - /* Reset viewport and Scissor (If viewport is smaller or equal to the framebuffer size). */ - if (update_viewport && t_viewport[2] <= width_ && t_viewport[3] <= height_) { - - this->viewport_set(t_viewport); - this->scissor_set(t_viewport); + /* Ensure size is correctly assigned. */ + GPUAttachment &attach = attachments_[first_attachment]; + int size[3]; + GPU_texture_get_mipmap_size(attach.tex, attach.mip, size); + this->size_set(size[0], size[1]); + srgb_ = (GPU_texture_format(attach.tex) == GPU_SRGB8_A8); } else { - this->viewport_reset(); - this->scissor_reset(); + /* Empty frame-buffer. */ + width_ = 0; + height_ = 0; } + /* Reset viewport and Scissor. */ + this->viewport_reset(); + this->scissor_reset(); + /* We have now updated our internal structures. */ dirty_attachments_ = false; }