diff options
Diffstat (limited to 'source/blender/gpu/metal/mtl_texture.mm')
-rw-r--r-- | source/blender/gpu/metal/mtl_texture.mm | 89 |
1 files changed, 15 insertions, 74 deletions
diff --git a/source/blender/gpu/metal/mtl_texture.mm b/source/blender/gpu/metal/mtl_texture.mm index 4af46c13751..b4e913e5be6 100644 --- a/source/blender/gpu/metal/mtl_texture.mm +++ b/source/blender/gpu/metal/mtl_texture.mm @@ -12,6 +12,7 @@ #include "GPU_batch_presets.h" #include "GPU_capabilities.h" #include "GPU_framebuffer.h" +#include "GPU_immediate.h" #include "GPU_platform.h" #include "GPU_state.h" @@ -303,7 +304,6 @@ void gpu::MTLTexture::blit(gpu::MTLTexture *dst, /* Execute graphics draw call to perform the blit. */ GPUBatch *quad = GPU_batch_preset_quad(); - GPU_batch_set_shader(quad, shader); float w = dst->width_get(); @@ -337,6 +337,20 @@ void gpu::MTLTexture::blit(gpu::MTLTexture *dst, GPU_batch_draw(quad); + /* TMP draw with IMM TODO(Metal): Remove this once GPUBatch is supported. */ + GPUVertFormat *imm_format = immVertexFormat(); + uint pos = GPU_vertformat_attr_add(imm_format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); + + immBindShader(shader); + immBegin(GPU_PRIM_TRI_STRIP, 4); + immVertex2f(pos, 1, 0); + immVertex2f(pos, 0, 0); + immVertex2f(pos, 1, 1); + immVertex2f(pos, 0, 1); + immEnd(); + immUnbindProgram(); + /**********************/ + /* restoring old pipeline state. */ GPU_depth_mask(depth_write_prev); GPU_stencil_write_mask_set(stencil_mask_prev); @@ -1463,79 +1477,6 @@ bool gpu::MTLTexture::init_internal(GPUVertBuf *vbo) BLI_assert_msg(this->format_ != GPU_DEPTH24_STENCIL8, "Apple silicon does not support GPU_DEPTH24_S8"); - MTLPixelFormat mtl_format = gpu_texture_format_to_metal(this->format_); - mtl_max_mips_ = 1; - mipmaps_ = 0; - this->mip_range_set(0, 0); - - /* Create texture from GPUVertBuf's buffer. */ - MTLVertBuf *mtl_vbo = static_cast<MTLVertBuf *>(unwrap(vbo)); - mtl_vbo->bind(); - mtl_vbo->flag_used(); - - /* Get Metal Buffer. */ - id<MTLBuffer> source_buffer = mtl_vbo->get_metal_buffer(); - BLI_assert(source_buffer); - - /* Verify size. */ - if (w_ <= 0) { - MTL_LOG_WARNING("Allocating texture buffer of width 0!\n"); - w_ = 1; - } - - /* Verify Texture and vertex buffer alignment. */ - int bytes_per_pixel = get_mtl_format_bytesize(mtl_format); - int bytes_per_row = bytes_per_pixel * w_; - - MTLContext *mtl_ctx = MTLContext::get(); - uint align_requirement = static_cast<uint>( - [mtl_ctx->device minimumLinearTextureAlignmentForPixelFormat:mtl_format]); - - /* Verify per-vertex size aligns with texture size. */ - const GPUVertFormat *format = GPU_vertbuf_get_format(vbo); - BLI_assert(bytes_per_pixel == format->stride && - "Pixel format stride MUST match the texture format stride -- These being different " - "is likely caused by Metal's VBO padding to a minimum of 4-bytes per-vertex"); - UNUSED_VARS_NDEBUG(format); - - /* Create texture descriptor. */ - BLI_assert(type_ == GPU_TEXTURE_BUFFER); - texture_descriptor_ = [[MTLTextureDescriptor alloc] init]; - texture_descriptor_.pixelFormat = mtl_format; - texture_descriptor_.textureType = MTLTextureTypeTextureBuffer; - texture_descriptor_.width = w_; - texture_descriptor_.height = 1; - texture_descriptor_.depth = 1; - texture_descriptor_.arrayLength = 1; - texture_descriptor_.mipmapLevelCount = mtl_max_mips_; - texture_descriptor_.usage = - MTLTextureUsageShaderRead | MTLTextureUsageShaderWrite | - MTLTextureUsagePixelFormatView; /* TODO(Metal): Optimize usage flags. */ - texture_descriptor_.storageMode = [source_buffer storageMode]; - texture_descriptor_.sampleCount = 1; - texture_descriptor_.cpuCacheMode = [source_buffer cpuCacheMode]; - texture_descriptor_.hazardTrackingMode = [source_buffer hazardTrackingMode]; - - texture_ = [source_buffer - newTextureWithDescriptor:texture_descriptor_ - offset:0 - bytesPerRow:ceil_to_multiple_u(bytes_per_row, align_requirement)]; - aligned_w_ = bytes_per_row / bytes_per_pixel; - - BLI_assert(texture_); - texture_.label = [NSString stringWithUTF8String:this->get_name()]; - is_baked_ = true; - is_dirty_ = false; - resource_mode_ = MTL_TEXTURE_MODE_VBO; - - /* Track Status. */ - vert_buffer_ = mtl_vbo; - vert_buffer_mtl_ = source_buffer; - - /* Cleanup. */ - [texture_descriptor_ release]; - texture_descriptor_ = nullptr; - return true; } |