/* nsIVariant getDevices (in T_WebCLDeviceType aType); */ NS_IMETHODIMP WebCLPlatform::GetDevices(T_WebCLDeviceType aType, JSContext *cx, nsIVariant **_retval) { D_METHOD_START; NS_ENSURE_ARG_POINTER (_retval); nsresult rv; nsTArray<cl_device_id> devices; cl_int err = mWrapper->getDeviceIDs (mInternal, aType, devices); ENSURE_LIB_WRAPPER_SUCCESS (mWrapper); ENSURE_CL_OP_SUCCESS (err); nsCOMPtr<nsIVariant> res; rv = WebCL_convertVectorToJSArrayInVariant (cx, devices, types::DEVICE_V, getter_AddRefs (res), mWrapper); NS_ENSURE_SUCCESS (rv, rv); NS_ADDREF (*_retval = res); return NS_OK; }
/* nsIVariant createKernelsInProgram (); */ NS_IMETHODIMP WebCLProgram::CreateKernelsInProgram(JSContext *cx, nsIVariant **_retval) { D_METHOD_START; NS_ENSURE_ARG_POINTER (cx); NS_ENSURE_ARG_POINTER (_retval); nsresult rv; nsTArray<cl_kernel> kernels; cl_int err = mWrapper->createKernelsInProgram (mInternal, kernels); ENSURE_LIB_WRAPPER_SUCCESS (mWrapper); ENSURE_CL_OP_SUCCESS (err); nsCOMPtr<nsIVariant> value; rv = WebCL_convertVectorToJSArrayInVariant (cx, kernels, types::KERNEL_V, getter_AddRefs (value), mWrapper); NS_ENSURE_SUCCESS (rv, rv); NS_ADDREF (*_retval = value); return NS_OK; }
/* nsIVariant getProgramInfo (in long aName); */ NS_IMETHODIMP WebCLProgram::GetProgramInfo(PRInt32 aName, JSContext *cx, nsIVariant **_retval) { D_METHOD_START; NS_ENSURE_ARG_POINTER (_retval); nsresult rv; cl_int err = CL_SUCCESS; int type = getTypeForInfoName (aName); if (type == types::UNKNOWN) { D_LOG (LOG_LEVEL_ERROR, "Info parameter name %d does not have a known type.", aName); WebCL_reportJSError (cx, "Info name %d is not supported by %s.", aName, __FUNCTION__); return WEBCL_XPCOM_ERROR; //NS_ERROR_FAILURE; } nsCOMPtr<nsIWritableVariant> variant = do_CreateInstance(NS_VARIANT_CONTRACTID, &rv); NS_ENSURE_SUCCESS (rv, rv); // TODO NOTE CL_PROGRAM_BINARIES WORKAROUND - THIS PARAMETER SHOULD PROBABLY BE BLOCKED if (aName == CL_PROGRAM_BINARIES) { // CL_PROGRAM_BINARIES does not write it's result directly to the target buffer // but to an array pointers to additional buffers of allocated by caller. The sizes // of these buffers are queried using CL_PROGRAM_BINARY_SIZES nsTArray<size_t> binarySizes; mWrapper->getProgramInfo (mInternal, CL_PROGRAM_BINARY_SIZES, binarySizes); nsTArray<char*> binaries; binaries.SetLength (binarySizes.Length()); for (size_t i = 0; i < binaries.Length(); ++i) { binaries[i] = (char*)malloc(sizeof(char) * binarySizes[i]); // Allocation failures produce NULL and we expect that OCL library knows // how to handle that. } err = mWrapper->library()->symbols->clGetProgramInfo (mInternal, CL_PROGRAM_BINARIES, sizeof(char*) * binaries.Length(), binaries.Elements(), NULL); if (CL_FAILED (err)) { for (nsTArray<char*>::index_type i = 0; i < binaries.Length(); ++i) { free (binaries[i]); } D_LOG (LOG_LEVEL_ERROR, "getInfo for %d failed. (error %d)", aName, err); WebCL_reportJSError (cx, "%s failed with error %d.", __FUNCTION__, err); return WEBCL_XPCOM_ERROR; /*NS_ERROR_FAILURE;*/ } // Convert result to something we can apply our standard mechanism to nsTArray<nsCString> results; results.SetCapacity (binaries.Length()); for (size_t i = 0; i < binaries.Length(); ++i) { results.AppendElement (nsCString(binaries[i])); free (binaries[i]); } rv = WebCL_convertVectorToJSArrayInVariant (cx, results, types::STRING_V, (nsIVariant**)&variant, mWrapper); NS_ENSURE_SUCCESS (rv, rv); } else { WEBCL_GETINFO_MEDIATOR_SWITCH (aName, type, mWrapper, getProgramInfo, mInternal, variant, err, rv); } NS_ADDREF (*_retval = variant); return NS_OK; }