Back in the early days of consumer 3D graphics accelerators, there was no such thing as a shader program and GPUs were not Turing-complete. You had to pick from among the texture blending modes that your GPU natively supported. Some GPUs exposed an interface that was basically a large portion of the OpenGL 1.x state machine, implemented in hardware.
You had that already in computers like the Amiga where you would arrange a memory region with set of operations that you wanted to do, enable DMA and let the blitter carry along doing the job on its own.
Likewise with 16 bit game consoles with their sprite engines.