# -*- coding: utf-8 -*-
################################ Begin license #################################
# Copyright (C) Laboratory of Imaging technologies,
#               Faculty of Electrical Engineering,
#               University of Ljubljana.
#
# This file is part of PyXOpto.
#
# PyXOpto is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# PyXOpto is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with PyXOpto. If not, see <https://www.gnu.org/licenses/>.
################################# End license ##################################
from xopto.mcbase.mcoptions import *
[docs]class McMaterialMemory(McTypeOption):
    '''
    OpenCL memory type used to hold the array of materials.
    Use one of "constant_mem" or "global_mem".
    Default is "global_mem".
    Note
    ----
    Selecting "constant_mem" memory will likely lead to a significant
    performance boost, in particular on older GPUs.
    However, note that the amount of available "constant_mem" memory on GPUs is
    typically limited to about 64k.
    '''
    #class global(McObject):
    #    cl_options = [('MC_MATERIAL_ARRAY_MEMORY', '__global')]
    constant_mem = McTypeOption('MC_MATERIAL_ARRAY_MEMORY', '__constant')
    global_mem = McTypeOption('MC_MATERIAL_ARRAY_MEMORY', '__global')
    default = constant_mem
    def __init__(self, value: str='global'):
        '''
        Initializes kernel option that sets the OpenCL memory type used for
        the array of materials.
        Parameters
        ----------
        value: str
            Use "global_mem" to move the array of materials to the __global
            OpenCL memory or use "constant_mem" to move the array of materials
            to the __constant OpenCL memory.
        '''
        value = {'global': '__global', '__global':'__global',
                 'constant':'__constant', '__constant':'__constant'}.get(value)
        if value is None:
            raise ValueError(
                'Material data memory type must be one of '
                '"constant" or "global", but got "{}"!'.format(value)
            )
        super().__init__('MC_MATERIAL_ARRAY_MEMORY', value)
    def __repr__(self):
        return '{}({})'.format(self.__class__.__name__, self.cl_options[0][1])