@@ -1891,3 +1891,178 @@ cvk_command_image_init::build_batchable_inner(cvk_command_buffer& cmdbuf) {
18911891
18921892 return CL_SUCCESS;
18931893}
1894+
1895+ cl_int cvk_command_fill_image_on_device::build_batchable_inner (
1896+ cvk_command_buffer& cmdbuf) {
1897+ if (m_cmd_kernel != nullptr ) {
1898+ return m_cmd_kernel->build_batchable_inner (cmdbuf);
1899+ }
1900+ char source[1024 ];
1901+ char color[512 ];
1902+ const char * kernel_name = " fill_image" ;
1903+ const char * type = get_image_type ();
1904+ const char * access_qualifier = get_image_access_qualifier ();
1905+ const char * coord = get_image_coord ();
1906+ get_image_color (color);
1907+ sprintf (source,
1908+ " kernel void %s(write_only %s image) { write_image%s(image, "
1909+ " %s, %s); }" ,
1910+ kernel_name, type, access_qualifier, coord, color);
1911+
1912+ auto program = std::make_unique<cvk_program>(m_queue->context ());
1913+ program->append_source (source, strlen (source));
1914+ const cl_device_id device = static_cast <cl_device_id>(m_queue->device ());
1915+ auto err = program->build (build_operation::build, 1 , &device, nullptr , 0 ,
1916+ nullptr , nullptr , nullptr , nullptr );
1917+ if (err != CL_SUCCESS) {
1918+ cvk_error_fn (" fail to build program (%u)" , err);
1919+ return CL_OUT_OF_RESOURCES;
1920+ }
1921+
1922+ auto prog = program.release ();
1923+ auto kernel = std::make_unique<cvk_kernel>(prog, kernel_name);
1924+ prog->release ();
1925+ err = kernel->init ();
1926+ if (err != CL_SUCCESS) {
1927+ cvk_error_fn (" fail to init kernel (%u)" , err);
1928+ return err;
1929+ }
1930+ err = kernel->set_arg (0 , sizeof (m_mem), &m_mem);
1931+ if (err != CL_SUCCESS) {
1932+ cvk_error_fn (" fail to set arg (%u)" , err);
1933+ return err;
1934+ }
1935+
1936+ cl_uint work_dim = dimensions ();
1937+ cvk_ndrange ndrange (work_dim, m_work_offset.data (), m_work_size.data (),
1938+ nullptr );
1939+ auto kern = kernel.release ();
1940+ m_cmd_kernel =
1941+ std::make_unique<cvk_command_kernel>(m_queue, kern, work_dim, ndrange);
1942+ kern->release ();
1943+ return m_cmd_kernel->build_batchable_inner (cmdbuf);
1944+ }
1945+
1946+ cl_uint cvk_command_fill_image_on_device::dimensions () const {
1947+ switch (m_image->image_type ()) {
1948+ default :
1949+ CVK_ASSERT (false );
1950+ return 0 ;
1951+ case CL_MEM_OBJECT_IMAGE1D:
1952+ case CL_MEM_OBJECT_IMAGE1D_BUFFER:
1953+ return 1 ;
1954+ case CL_MEM_OBJECT_IMAGE1D_ARRAY:
1955+ case CL_MEM_OBJECT_IMAGE2D:
1956+ return 2 ;
1957+ case CL_MEM_OBJECT_IMAGE2D_ARRAY:
1958+ case CL_MEM_OBJECT_IMAGE3D:
1959+ return 3 ;
1960+ }
1961+ }
1962+
1963+ const char *
1964+ cvk_command_fill_image_on_device::get_image_access_qualifier () const {
1965+ switch (m_image->format ().image_channel_data_type ) {
1966+ default :
1967+ CVK_ASSERT (false );
1968+ return nullptr ;
1969+ case CL_UNORM_SHORT_565:
1970+ case CL_UNORM_SHORT_555:
1971+ case CL_UNORM_INT_101010:
1972+ case CL_UNORM_INT_101010_2:
1973+ case CL_UNORM_INT8:
1974+ case CL_UNORM_INT16:
1975+ return " ui" ;
1976+ case CL_UNSIGNED_INT8:
1977+ case CL_UNSIGNED_INT16:
1978+ case CL_UNSIGNED_INT32:
1979+ case CL_SIGNED_INT8:
1980+ case CL_SIGNED_INT16:
1981+ case CL_SIGNED_INT32:
1982+ case CL_FLOAT:
1983+ case CL_HALF_FLOAT:
1984+ return " f" ;
1985+ case CL_SNORM_INT8:
1986+ case CL_SNORM_INT16:
1987+ return " i" ;
1988+ }
1989+ }
1990+
1991+ const char * cvk_command_fill_image_on_device::get_image_type () const {
1992+ switch (m_image->image_type ()) {
1993+ default :
1994+ CVK_ASSERT (false );
1995+ return nullptr ;
1996+ case CL_MEM_OBJECT_IMAGE1D:
1997+ return " image1d_t" ;
1998+ case CL_MEM_OBJECT_IMAGE1D_BUFFER:
1999+ return " image1d_buffer_t" ;
2000+ case CL_MEM_OBJECT_IMAGE1D_ARRAY:
2001+ return " image1d_array_t" ;
2002+ case CL_MEM_OBJECT_IMAGE2D:
2003+ return " image2d_t" ;
2004+ case CL_MEM_OBJECT_IMAGE2D_ARRAY:
2005+ return " image2d_array_t" ;
2006+ case CL_MEM_OBJECT_IMAGE3D:
2007+ return " image3d" ;
2008+ }
2009+ }
2010+
2011+ const char * cvk_command_fill_image_on_device::get_image_coord () const {
2012+ switch (m_image->image_type ()) {
2013+ default :
2014+ CVK_ASSERT (false );
2015+ return nullptr ;
2016+ case CL_MEM_OBJECT_IMAGE1D:
2017+ case CL_MEM_OBJECT_IMAGE1D_BUFFER:
2018+ return " get_global_id(0)" ;
2019+ case CL_MEM_OBJECT_IMAGE1D_ARRAY:
2020+ case CL_MEM_OBJECT_IMAGE2D:
2021+ return " (int2)(get_global_id(0), get_global_id(1))" ;
2022+ case CL_MEM_OBJECT_IMAGE2D_ARRAY:
2023+ case CL_MEM_OBJECT_IMAGE3D:
2024+ return " (int4)(get_global_id(0), get_global_id(1), "
2025+ " get_global_id(2), 0)" ;
2026+ }
2027+ }
2028+
2029+ void cvk_command_fill_image_on_device::get_image_color (char * color) const {
2030+ switch (m_image->format ().image_channel_data_type ) {
2031+ default :
2032+ CVK_ASSERT (false );
2033+ break ;
2034+ case CL_UNORM_SHORT_565:
2035+ case CL_UNORM_SHORT_555:
2036+ case CL_UNORM_INT_101010:
2037+ case CL_UNORM_INT_101010_2:
2038+ case CL_UNORM_INT8:
2039+ case CL_UNORM_INT16: {
2040+ auto fill_color = static_cast <const uint32_t *>(
2041+ static_cast <const void *>(m_fill_color.data ()));
2042+ sprintf (color, " (uint4)(%u, %u, %u, %u)" , fill_color[0 ], fill_color[1 ],
2043+ fill_color[2 ], fill_color[3 ]);
2044+ } break ;
2045+ case CL_UNSIGNED_INT8:
2046+ case CL_UNSIGNED_INT16:
2047+ case CL_UNSIGNED_INT32:
2048+ case CL_SIGNED_INT8:
2049+ case CL_SIGNED_INT16:
2050+ case CL_SIGNED_INT32:
2051+ case CL_FLOAT:
2052+ case CL_HALF_FLOAT: {
2053+ auto fill_color = static_cast <const uint32_t *>(
2054+ static_cast <const void *>(m_fill_color.data ()));
2055+ sprintf (color,
2056+ " (float4)(as_float(0x%x), as_float(0x%x), as_float(0x%x), "
2057+ " as_float(0x%x))" ,
2058+ fill_color[0 ], fill_color[1 ], fill_color[2 ], fill_color[3 ]);
2059+ } break ;
2060+ case CL_SNORM_INT8:
2061+ case CL_SNORM_INT16: {
2062+ auto fill_color = static_cast <const int32_t *>(
2063+ static_cast <const void *>(m_fill_color.data ()));
2064+ sprintf (color, " (int4)(%i, %i, %i, %i)" , fill_color[0 ], fill_color[1 ],
2065+ fill_color[2 ], fill_color[3 ]);
2066+ } break ;
2067+ }
2068+ }
0 commit comments