1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/* 2a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project 3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License. 6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at 7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software 11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and 14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License. 15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */ 16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsContext.h" 18fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsProgram.h" 19c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 20f8852d0494a260c583795a96a2a06c49b86a9b10Ian Rogers#include <inttypes.h> 21f8852d0494a260c583795a96a2a06c49b86a9b10Ian Rogers 22326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 23326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 24326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 25748eb07e805b93c2bf79340d4937963ab739d17cAlex SakhartchoukProgram::Program(Context *rsc, const char * shaderText, size_t shaderLength, 26f8852d0494a260c583795a96a2a06c49b86a9b10Ian Rogers const uintptr_t * params, size_t paramLength) 277f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk : ProgramBase(rsc) { 284815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 29afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk initMemberVars(); 304815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (uint32_t ct=0; ct < paramLength; ct+=2) { 314815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams if (params[ct] == RS_PROGRAM_PARAM_INPUT) { 32a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.inputElementsCount++; 334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 344815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams if (params[ct] == RS_PROGRAM_PARAM_CONSTANT) { 35a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.constantsCount++; 364815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 3784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk if (params[ct] == RS_PROGRAM_PARAM_TEXTURE_TYPE) { 38a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.texturesCount++; 39f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams } 404815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 414815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 42064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mTextures = new ObjectBaseRef<Allocation>[mHal.state.texturesCount]; 43064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mSamplers = new ObjectBaseRef<Sampler>[mHal.state.texturesCount]; 44064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mInputElements = new ObjectBaseRef<Element>[mHal.state.inputElementsCount]; 45064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mConstantTypes = new ObjectBaseRef<Type>[mHal.state.constantsCount]; 46064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mConstants = new ObjectBaseRef<Allocation>[mHal.state.constantsCount]; 47064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk 48064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.textures = new Allocation*[mHal.state.texturesCount]; 49064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.samplers = new Sampler*[mHal.state.texturesCount]; 50a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.textureTargets = new RsTextureTarget[mHal.state.texturesCount]; 51064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.inputElements = new Element*[mHal.state.inputElementsCount]; 52064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.constantTypes = new Type*[mHal.state.constantsCount]; 53064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.constants = new Allocation*[mHal.state.constantsCount]; 54064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk 55064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk // Will initialize everything 56064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk freeChildren(); 574815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 584815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t input = 0; 594815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t constant = 0; 6084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk uint32_t texture = 0; 614815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (uint32_t ct=0; ct < paramLength; ct+=2) { 624815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams if (params[ct] == RS_PROGRAM_PARAM_INPUT) { 63064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mInputElements[input].set(reinterpret_cast<Element *>(params[ct+1])); 64064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.inputElements[input++] = reinterpret_cast<Element *>(params[ct+1]); 654815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 664815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams if (params[ct] == RS_PROGRAM_PARAM_CONSTANT) { 67064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mConstantTypes[constant].set(reinterpret_cast<Type *>(params[ct+1])); 68064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.constantTypes[constant++] = reinterpret_cast<Type *>(params[ct+1]); 694815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 7084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk if (params[ct] == RS_PROGRAM_PARAM_TEXTURE_TYPE) { 71a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.textureTargets[texture++] = (RsTextureTarget)params[ct+1]; 7284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 734815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 74e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mIsInternal = false; 75e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk uint32_t internalTokenLen = strlen(RS_SHADER_INTERNAL); 76afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (shaderLength > internalTokenLen && 77e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk strncmp(RS_SHADER_INTERNAL, shaderText, internalTokenLen) == 0) { 78e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mIsInternal = true; 79e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderText += internalTokenLen; 80e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderLength -= internalTokenLen; 81e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 82f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams 83f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams mUserShader = rsuCopyString(shaderText, shaderLength); 84f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams mUserShaderLen = shaderLength; 85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 87afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgram::~Program() { 88c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams freeChildren(); 89889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk 90064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mTextures; 91064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mSamplers; 92064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mInputElements; 93064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mConstantTypes; 94064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mConstants; 95064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk 96a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete[] mHal.state.textures; 97a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete[] mHal.state.samplers; 98a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete[] mHal.state.textureTargets; 99a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete[] mHal.state.inputElements; 100a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete[] mHal.state.constantTypes; 101a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete[] mHal.state.constants; 102a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.inputElementsCount = 0; 103a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.constantsCount = 0; 104a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.texturesCount = 0; 105f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams 10644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (mUserShader != nullptr) { 107f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams delete[] mUserShader; 10844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mUserShader = nullptr; 109f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams } 110f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams mUserShaderLen = 0; 111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 113c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Samsbool Program::freeChildren() { 114c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams for (uint32_t ct=0; ct < mHal.state.constantsCount; ct++) { 11544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes bindAllocation(nullptr, nullptr, ct); 116c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams } 117c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams 118c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams for (uint32_t ct=0; ct < mHal.state.texturesCount; ct++) { 11944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes bindTexture(nullptr, ct, nullptr); 12044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes bindSampler(nullptr, ct, nullptr); 121c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams } 122c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams return false; 123c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams} 124c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams 12554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukvoid Program::initMemberVars() { 12654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mDirty = true; 12754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 12844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mHal.drv = nullptr; 12944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mHal.state.textures = nullptr; 13044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mHal.state.samplers = nullptr; 13144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mHal.state.textureTargets = nullptr; 13244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mHal.state.inputElements = nullptr; 13344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mHal.state.constantTypes = nullptr; 13444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mHal.state.constants = nullptr; 135a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 136a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.inputElementsCount = 0; 137a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.constantsCount = 0; 138a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.texturesCount = 0; 139a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 14044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mTextures = nullptr; 14144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mSamplers = nullptr; 14244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mInputElements = nullptr; 14344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mConstantTypes = nullptr; 14444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mConstants = nullptr; 145064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk 14654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mIsInternal = false; 147f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams 14844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mUserShader = nullptr; 149f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams mUserShaderLen = 0; 15054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 152afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Program::bindAllocation(Context *rsc, Allocation *alloc, uint32_t slot) { 15344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (alloc != nullptr) { 154a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (slot >= mHal.state.constantsCount) { 155f8852d0494a260c583795a96a2a06c49b86a9b10Ian Rogers ALOGE("Attempt to bind alloc at slot %u, on shader id %" PRIuPTR ", but const count is %u", 156f8852d0494a260c583795a96a2a06c49b86a9b10Ian Rogers slot, (uintptr_t)this, mHal.state.constantsCount); 157383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind allocation"); 158383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 159383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 160064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (alloc->getType() != mConstantTypes[slot].get()) { 161f8852d0494a260c583795a96a2a06c49b86a9b10Ian Rogers ALOGE("Attempt to bind alloc at slot %u, on shader id %" PRIuPTR ", but types mismatch", 162f8852d0494a260c583795a96a2a06c49b86a9b10Ian Rogers slot, (uintptr_t)this); 163383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind allocation"); 164383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 165383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 166383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 167064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mConstants[slot].get() == alloc) { 1685c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams return; 1695c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams } 170064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mConstants[slot].get()) { 171064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mConstants[slot]->removeProgramToDirty(this); 1725c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams } 173064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mConstants[slot].set(alloc); 174064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.constants[slot] = alloc; 1755c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams if (alloc) { 1765c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams alloc->addProgramToDirty(this); 1775c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams } 178326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mDirty = true; 179326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 180326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 181afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Program::bindTexture(Context *rsc, uint32_t slot, Allocation *a) { 182a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (slot >= mHal.state.texturesCount) { 183af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Attempt to bind texture to slot %u but tex count is %u", slot, mHal.state.texturesCount); 184383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind texture"); 1857dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams return; 1867dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams } 1877dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams 188a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (a && a->getType()->getDimFaces() && mHal.state.textureTargets[slot] != RS_TEXTURE_CUBE) { 189af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Attempt to bind cubemap to slot %u but 2d texture needed", slot); 19084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind cubemap to 2d texture slot"); 19184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk return; 19284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 19384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 194064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mTextures[slot].set(a); 195064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.textures[slot] = a; 196064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk 1977dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams mDirty = true; 1987dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams} 1997dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams 200afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Program::bindSampler(Context *rsc, uint32_t slot, Sampler *s) { 201a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (slot >= mHal.state.texturesCount) { 202af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Attempt to bind sampler to slot %u but tex count is %u", slot, mHal.state.texturesCount); 203383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind sampler"); 2047dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams return; 2057dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams } 2067dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams 207064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mSamplers[slot].set(s); 208064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.samplers[slot] = s; 2097dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams mDirty = true; 2107dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams} 2117dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams 2124815c0d121310cfcd6a8aba4eab77a9910af53acJason Samsnamespace android { 2134815c0d121310cfcd6a8aba4eab77a9910af53acJason Samsnamespace renderscript { 2144815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 215afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_ProgramBindConstants(Context *rsc, RsProgram vp, uint32_t slot, RsAllocation constants) { 2164815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams Program *p = static_cast<Program *>(vp); 217383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk p->bindAllocation(rsc, static_cast<Allocation *>(constants), slot); 2184815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams} 2194815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 220afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_ProgramBindTexture(Context *rsc, RsProgram vpf, uint32_t slot, RsAllocation a) { 2217dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams Program *p = static_cast<Program *>(vpf); 222383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk p->bindTexture(rsc, slot, static_cast<Allocation *>(a)); 2237dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams} 2247dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams 225afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_ProgramBindSampler(Context *rsc, RsProgram vpf, uint32_t slot, RsSampler s) { 2267dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams Program *p = static_cast<Program *>(vpf); 227383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk p->bindSampler(rsc, slot, static_cast<Sampler *>(s)); 2287dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams} 2294815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 2304815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams} 2314815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams} 2324815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 233